每个django模型类都有一个默认的管理器,objects
常用的查询
常用的查询方法:
Student皆为数据库名称
1. 获取所有记录all:res = Student.objects.all()
2. 查询单条get:res = Students.objects.get(name='liuxinghua')
注意:get返回的对象具有唯一性质,如果符合条件的对象有多个,则get报错!
3. 条件查询filter与排除查询exclude
filter:res = Student.objects.filter(name='liuxinghua') 获取条件记录
注意:filter(**kwargs)方法:根据参数提供的提取条件,获取一个过滤后的QuerySet
exclude:res = Student.objects.exclude(name='liuxinghua') 获取条件外记录
4. 获取第一条数据first:res = Student.object.first()
获取最后一条数据:res = Student.objects.last()
5. 制定字段查询:
values:提升查询效率,仅能拿到制定字段的值,其他字段值无法获取;
res = Student.objects.values('id', 'name', 'age') 仅能获取id、name、age数据
only:提升查询效率,能拿到制定字段的值,其他字段值也能获取,主键必带
res = Student.objects.only('id', 'name', 'age')
defer:排除制定字段,进行查询,主键必带,作用与only相反
res = Student.objects.defer('id', 'name', 'age')
6. 排序order by
单项排序:res = Student.objects.order_by('age')
多项排序:res = Student.objects.order_by('age', 'id')
逆向排序:res = Student.objects.ordeer_by('-age')
7. 切片,不支持负索引,数据量大时不要使用步长 res[:3] 0,1,2项目
8. 多条件查询
and查询:res = Student.objects.filter(age=18, sex=1)
or查询:
from django.db.models import Q
res = Student.objects.filter(Q(age=18), Q(sex=1)|Q(age=20))
9. 将返回来的QuerySet中的Model转换为字典:res = Student.objects.all().values()
若仅需要QuerySet中的默写字段:res = Student.objects.values('id', 'name', 'age')
10. 获取当前查询到的数据的总数:res = Student.objects.count()
常用的查询条件
1. 包含查询:
res = Student.objects.filter(name__contains='Lu') # 查询name中包含‘Lu’的数据记录
res = Student.objects.filter(name__icontains='Lu') # 查询name中包含‘lu’的数据记录,忽略大小写
2. 范围查询:
大于:res = Student.objects.filte(age__gt=12) # 查询age大于12的数据记录
......
常用的模型字段类型
Field的常用参数
官方文档:https://docs.djangoproject.com/zh-hans/3.2/ref/models/fields/#verbose-name
表关系的实现
1. 一对一关系性表格
views.py文件更新代码
在一对一情况下,关联字段两边都可以摆放,存在以下两种情况:
a. 一对一情况下,在StudentDetail表信息删除时,Student中的信息还存在意义,故在Student类定义中采用on_delete=models.SET_NULL设定
detail = models.OneToOneField('StudentDetail', on_delete=models.SET_NULL, null=True) # models.SET_NULL代表的是关联表数据删除后,把对应的字段设置为null
b. 一对一情况下,在Student表出现数据删除时,StudentDetail表信息则无意义了,故在StudentDetail类定义中采用on_delete=models.CASCADE
student = models.OneToOneField('Student', on_delete=models.CASCADE), # on_delete=models.CASCADE代表的是关联表数据删除后,把对应的字段也删除
from django.db import models class Student(models.Model): # student模型是models.Model的子类 name = models.CharField(verbose_name='学生姓名', max_length=20) age = models.SmallIntegerField(verbose_name='学生年龄', null=True) sex = models.SmallIntegerField(default=1, verbose_name='学生性别') # 设置默认值 qq = models.CharField(max_length=20, null=True, verbose_name='QQ号码') phone = models.CharField(max_length=20, null=True, verbose_name='电话号码') c_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # auto_now_add=True自动填充当前时间 # detail = models.OneToOneField('StudentDetail', on_delete=models.SET_NULL, null=True) # models.SET_NULL代表的是关联表数据删除后,把对应的字段设置为null class Meta: db_table = 'student' # 对模型进行重命名 def __str__(self): return self.name class StudentDetail(models.Model): address = models.CharField(max_length=20, default='', verbose_name='地址') student = models.OneToOneField('Student', on_delete=models.CASCADE) class Meta: db_table = 'detail' def __str__(self): return self.address
2. 一对多关系性表格
一对多情况下,关联字段需要放在多表中,而在关联数据被删除后,对应字段还存在意义,故需要把该字段的关联数据设置为null,故采用models.SET_NULL
grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True)
from django.db import models class Student(models.Model): # student模型是models.Model的子类 name = models.CharField(verbose_name='学生姓名', max_length=20) age = models.SmallIntegerField(verbose_name='学生年龄', null=True) sex = models.SmallIntegerField(default=1, verbose_name='学生性别') # 设置默认值 qq = models.CharField(max_length=20, null=True, verbose_name='QQ号码') phone = models.CharField(max_length=20, null=True, verbose_name='电话号码') c_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # auto_now_add=True自动填充当前时间 grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True) class Meta: db_table = 'student' # 对模型进行重命名 def __str__(self): return self.name class Grade(models.Model): name = models.CharField('班级名称', max_length=20) num = models.CharField('班期', max_length=20) class Meta: db_table = 'grade'
3. 多对多关系性表格
from django.db import models class Student(models.Model): # student模型是models.Model的子类 name = models.CharField(verbose_name='学生姓名', max_length=20) age = models.SmallIntegerField(verbose_name='学生年龄', null=True) sex = models.SmallIntegerField(default=1, verbose_name='学生性别') # 设置默认值 qq = models.CharField(max_length=20, null=True, verbose_name='QQ号码') phone = models.CharField(max_length=20, null=True, verbose_name='电话号码') c_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # auto_now_add=True自动填充当前时间 class Meta: db_table = 'student' # 对模型进行重命名 def __str__(self): return self.name class Course(models.Model): name = models.CharField('课程名称', max_length=20) students = models.ManyToManyField('Student') class Meta: db_table = 'Course'
Tools>Run manage.py Task进入manage.py@CRM界面
执行模型更改的生成迁移文件并让迁移文件生效
makemigrations
migrate
在多对多表格关联后其会自动生成中间关联表格。
迁移命名总结:
1. 运行命令python manage.py makemigrations teacher 创建迁移
2. 运行命令python manage.py sqlmigrate 迁移序号 查看迁移sql语句
3. 运行命令python manage.py migrate teacher 迁移序号 回滚回指定迁移
4. 运行命令python manage.py migrate 应用这些迁移