七.Django 模型中的常用查询及关系的实现
1.表关系型数据库操作
1.1常用表查询方法
1.2常用查询条件
查找对象的条件的意思是传给以上方法的一些参数。相当于是SQL语句中的where语句后面的条件,语法为字段名__规则(是连着连个下划线哦)
1.3常用字段的映射关系
Mysql的数据类型映射到Django的模型数据类型
2.常用的模型字段类型
2.1 模型字段类型
1. IntegerField : 整型,映射到数据库中的int类型。
2. CharField: 字符类型,映射到数据库中的varchar类型,通过max_length指定最大长度。
3. TextField: 文本类型,映射到数据库中的text类型。
4. BooleanField: 布尔类型,映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField。
5. DateField: 日期类型,没有时间。映射到数据库中是date类型,
在使用的时候,可以设置DateField.auto_now每次保存对象时,自动设置该字段为当前时间。设置DateField.auto_now_add当对象第一次被创建时自动设置当前时间。
6. DateTimeField: 日期时间类型。映射到数据库中的是datetime类型,
在使用的时候,传递datetime.datetime()进去。
2.2 Field的常用参数常用参数
- primary_key: 指定是否为主键。
- unique: 指定是否唯一。
- null: 指定是否为空,默认为False。
- blank: 等于True时form表单验证时可以为空,默认为False。
- default: 设置默认值。
- DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及TimModel.save()方法才会调用e类才有的。
- DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值
![]() | ![]() |
1 id 是自动生成的不需要配置,
2 我们的属性对应表中的字段,字段类型也和表中一一对应
3.表关系的实现
3.1 表关系的实现
表关系的实现通过.外键,唯一键,联合唯一键来确定
3.2 表关系图
4. 例子:一对多
在第六节,我们建立了User表(3条消息) 六.模型基础 2021-03-03_明玥几时有的博客-CSDN博客:如下
在例子中:我们将建立一个用户与书籍的表格,一个用户可以对应很多的书籍
4.1建立新的模型
from django.db import models
# Create your models here.
'''
继承自模型类models
模型类和数据库表的关系
属性和表的字段的对应关系
'''
class BookInfo(models.Model):
name = models.CharField(max_length= 25)
#外键 参数:连接的表,on_delete
book = models.ForeignKey('User',on_delete = models.CASCADE)
class Meta:
db_table = 'Bookinfo' #给定表名
def __str__(self):
#返回数据库的属性
return self.name
4.2将模型映射到数据库
1.首先执行以下命令,要创建映射文件
python manage.py makemigrations
命令后面可以跟app名称,表示指定对某个app的模型进行映射,没写所有的app都执行.
2.执行以下命令,将映射文件中的映射数据提交到数据库中
python manage.py migrate
3.进入mysql 查看映射的数据库表
- mysql -uroot -pqwe123 进入mysql
- show databases; 查看所有的数据库
- use look; 使用数据库
- show tables 查看数据库
打开数据我们能看到创建的以app名_模型名的数据表,而其他的一些表格是django自动生成的.
注意:如果要删除表,那么可以去django模型中注释掉模型类,然后执行映射的命令,不要手动在命令行里面去删除.
在执行前,保证我们创建模型的APP是已经注册过的APP
注意:在运行之前一定要将PyCharm的程序上传到虚拟机,不然会报一下错误
pymysql.err.OperationalError: (1046, 'No database selected')
django.db.utils.OperationalError: (1046, 'No database selected')
执行过程:
- workon 查看虚拟环境
- workon name 运行虚拟环境
- ls 查看目录下的文件
- cd 项目文件 进入文件
- python manage.py makemigrations 创建映射文件
- python manage.py migrate 映射文件中的映射数据提交到数据库中
- show tables 查看建立的表
4.3添加数据
1.在子应用的views中导入models.py文件,写显示函数
from django.shortcuts import render
from django.http import HttpResponse
from .models import User,BookInfo #导入建立的User,BookInfo模型
# Create your views here.
def add_book(request):
#添加书籍名称
book = BookInfo(name = '天龙八部',book_id = 1)
book.save()
return HttpResponse("书籍添加成功")
2.设置子路由的url
from django.urls import path,re_path
from .import views
urlpatterns = [
#添加书籍
path('add_book',views.add_book,name = 'update_user'),
]
3.运行结果:
4.在虚拟机的Mysql中查询新建的BookInfo表
4.4查询
1.在子应用的views中导入models.py文件,写显示函数
def seach_book(request):
#查询书籍
#通过用户查询ID查询用户的书籍
user = User.objects.get(id = 3)
#查询的时候多的一方模型类小写,一查多,set代表一查多
book = user.bookinfo_set.all()
print(user,book)
return HttpResponse("查询成功")
2.设置子路由的url
from django.urls import path,re_path
from .import views
urlpatterns = [
#查询书籍
path('seach_book',views.seach_book ,name = 'seach_book'),
]
3.运行结果
打印的结果
4.在Mysql中User表与Bookinfo表对比
![]() | ![]() |
注:查询的是User的ID为3的书籍.