Django的ORM的使用
在配置好setting.py文件中的数据库配置,跟INSTALLED_APPS中注册好应用
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'db_demo' # 注册应用,否则ORM的无法正常映射
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'db_demo.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'db_demo.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
# 数据配置文件
DATABASES = {
'default': {
# 数据库的模板引擎,
'ENGINE': 'django.db.backends.mysql',
# 数据库的名称
'NAME': 'book_manage',
# 连接数据库的用户名称
'USER':'root',
# 用户的密码
'PASSWORD':'123456',
# IP地址
'HOST':'127.0.0.1',
# 端口号
'PORT':'3306'
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
# 语言,默认是英文,可以改成中文
LANGUAGE_CODE = 'zh-hans'
# 时区也可以修改
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'
在项目的models.py文件中,新建类,并且继承Django的models.Model
from django.db import models
# Create your models here.
# 创建一个类,必须继Django的models.Model
class Book(models.Model):
# 使用model中的field的方法,来创建一张表
# 字段名ID,自动增长,并且为主键,注意,一个模型中如果没有写具体的主键的话,那Django的model会自动创建一个字段名为ID的自动增长的主键
id = models.AutoField(primary_key=True)
# 字段名为name.最长长度为100
name = models.CharField(max_length=100,null=False)
# 字段名为author,最长长度为100
author = models.CharField(max_length=100,null=False)
# 字段名为price,类型为Float,不能为空,默认为0
price = models.CharField(null=False,default=0)
然后在控制台中使用python manage.py makemigrations命令生成脚本迁移文件,记得需要将应用在项目注册,否则Django检测不到
(venv) H:\pythonProject\db_demo>python manage.py makemigrations
Migrations for 'mysql_demo':
mysql_demo\migrations\0001_initial.py
- Create model Book
(venv) H:\pythonProject\db_demo>
然后在控制台中输入 python manage.py migrate执行生成的脚本迁移文件
(venv) H:\pythonProject\db_demo>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, mysql_demo, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying mysql_demo.0001_initial... OK
Applying sessions.0001_initial... OK
生成之后,可以在数据中看到对应的表就生成了,需要注意的是,如果没有指定表名的话,默认的情况下是会是应用名_类名 比如上述中的代码生成的表名就是 mysql_demo_book
使用ORM对表进行增加操作,使用创建对象的方式操作模型,然后使用save即可
# 新增操作
def add_book(request):
book = Book(name='西游记',author='吴承恩',price=300)
book.save()
return HttpResponse("新增成功")
查询操作
# 查询操作
def get_book(request):
# PK就是primary key 主键的意思,无论该表中的主键是什么字段名,使用PK,都代表通过主键查询
# book = Book.objects.get(pk=1)
# 还有一种filter的方法,返回的是一个列表
book = Book.objects.filter(name='西游记')
print(book)
return HttpResponse("查询成功")
修改操作
# 修改操作
def modify_book(request):
book = Book.objects.get(pk=1)
book.price = 400
book.save()
return HttpResponse("修改成功")
删除操作
# 删除操作
def delete_book(request):
book = Book.objects.get(pk=1)
book.delete()
return HttpResponse("删除成功")
关键外键的使用,在Model中使用Django中的models.ForeignKey方法来进行外键的关联
# models.py
from django.db import models
# Create your models here.
# 创建一个类,必须继Django的models.Model
class Book(models.Model):
# 使用model中的field的方法,来创建一张表
# 字段名ID,自动增长,并且为主键,注意,一个模型中如果没有写具体的主键的话,那Django的model会自动创建一个字段名为ID的自动增长的主键
id = models.AutoField(primary_key=True)
# 字段名为name.最长长度为100
name = models.CharField(max_length=100,null=False)
# 字段名为author,最长长度为100
author = models.CharField(max_length=100,null=False)
# 字段名为price,类型为Float,不能为空,默认为0
price = models.FloatField(null=False,default=0)
def __str__(self):
return '书名:{name},作者:{author},价格:{price}'.format(name=self.name,author=self.author,price=self.price)
# ORM中外键的使用
class Article(models.Model):
name = models.CharField(max_length=100)
content = models.TextField()
# 使用foreignKey来创建外键关联,第一个参数为关联的表,on_delete指的是当外键表删除时,该数据的操作,CASCADE代表的是级联操作,也就是同时会删除该记录
book_id = models.ForeignKey('Book',on_delete=models.CASCADE)
创建好之后,需要运行python manage.py makemigrations创建数据库的迁移脚本,然后再执行python manage.py migrate 执行脚本文件,然后在视图函数中,去插入数据
def add_article(request):
# 也可以同时新增一个book的数据,然后直接绑定在article的外键名称中
# book = Book(name='111',author='2222',price=500)
# book.save()
article = Article(name='秋天来了',content='秋天的第一杯奶茶')
book = Book.objects.get(pk=2)
# 使用这种方式直接指定外键表的数据即可
article.book_id = book
# article.book_id = Book
article.save()
return HttpResponse("新增成功")
查询外键表的数据.也变的非常简单,直接使用.语法去获取即可
def get_article(request):
article = Article.objects.first()
# atricle.book_id 指向的就是之前关联好外键的表中的数据,可以直接通过对象的方式获取表中的所有数据
print(article.book_id.name)
return HttpResponse("查询成功")
ORM中的多对一的表,在model中创建一个Types的模型,作为其他多个模型的外键,然后同样的执行上面的命令,在数据库中生成表
from django.db import models
# Create your models here.
# 创建一个类,必须继Django的models.Model
class Book(models.Model):
# 使用model中的field的方法,来创建一张表
# 字段名ID,自动增长,并且为主键,注意,一个模型中如果没有写具体的主键的话,那Django的model会自动创建一个字段名为ID的自动增长的主键
id = models.AutoField(primary_key=True)
# 字段名为name.最长长度为100
name = models.CharField(max_length=100,null=False)
# 字段名为author,最长长度为100
author = models.CharField(max_length=100,null=False)
# 字段名为price,类型为Float,不能为空,默认为0
price = models.FloatField(null=False,default=0)
type = models.ForeignKey('Types',on_delete=models.CASCADE,null=True)
def __str__(self):
return '书名:{name},作者:{author},价格:{price}'.format(name=self.name,author=self.author,price=self.price)
# ORM中外键的使用
class Article(models.Model):
name = models.CharField(max_length=100)
content = models.TextField()
# 使用foreignKey来创建外键关联,第一个参数为关联的表,on_delete指的是当外键表删除时,该数据的操作,CASCADE代表的是级联操作,也就是同时会删除该记录
book_id = models.ForeignKey('Book',on_delete=models.CASCADE)
# 注意这个位置只所以要把null赋值为True,因为Types这个表是后面才加入的,之前的数据中没有这个外键,所以需要允许为空,否则会报错
type = models.ForeignKey('Types',on_delete=models.CASCADE,null=True)
# 一对多与多对一
class Types(models.Model):
name = models.CharField(max_length=100)
然后使用视图函数来去创建Types的表,并且新建book跟article将他们外键绑定,这样Types就是一对多了,添加好了之后,记得在urls.py中完成映射才能访问
from django.db import connection
from django.http import HttpResponse
from django.shortcuts import render
from .models import Book,Article,Types
# Create your views here.
# 新增操作
def add_book(request):
book = Book(name='西游记',author='吴承恩',price=300)
type = Types.objects.first()
book.type = type
book.save()
return HttpResponse("新增成功")
def add_article(request):
article = Article(name='秋天来了',content='秋天的第一杯奶茶')
book = Book.objects.get(pk=2)
article.book_id = book
type = Types.objects.first()
article.type = type
# article.book_id = Book
article.save()
return HttpResponse("新增成功")
def add_types(request):
type = Types(name='秋天专栏')
type.save()
return HttpResponse("新增类型成功")
一对多的表,如果想要获取某个外键关联下的所有数据,可以通过ORM外键自动添加的 模型名称小写_set.all()来获取,可以看示例代码,(这里需要注意,在pychart首次去写该属性时,没有提示,但是可以正常使用)
def get_type_all(request):
type = Types.objects.first()
# article_set这个属性在models中是没有定义的,是Django发现该模型被另外的模型通过外键关联之后自动添加的,Article是模型的名称,所以它的属性是article_set, Book是模型名称,那属性就是book_set 这个默认的规则
type.article_set.all()
type.book_set.all()
return HttpResponse("查询成功")
数据,可以通过ORM外键自动添加的 模型名称小写_set.all()来获取,可以看示例代码,(这里需要注意,在pychart首次去写该属性时,没有提示,但是可以正常使用)
def get_type_all(request):
type = Types.objects.first()
# article_set这个属性在models中是没有定义的,是Django发现该模型被另外的模型通过外键关联之后自动添加的,Article是模型的名称,所以它的属性是article_set, Book是模型名称,那属性就是book_set 这个默认的规则
type.article_set.all()
type.book_set.all()
return HttpResponse("查询成功")