本篇文章将讲述外键的定义,以及Model的查询的几种方法,显性属性,隐形属性和ModelManager的定制,以及模型属性中字段类型和字段选项的介绍
外键的定义
class Grade(models.Model):
grade = models.CharField(max_length=16)
class Stu(models.Model):
stu = models.CharField(max_length=16)
grade = models.ForeignKey(Grade, on_delete=models.CASCADE) # 定义外键
其中on_delete
再django2.0后成为必选参数
on_delete=models.CASCADE
表示级联删除
F
- 可以获取我们属性的值
- 可以实现一个模型的不同属性的运算操作
- 还可以支持算数运算
- 通常在模型的自我属性比较
例如我们有一个这样的模型:
定义如下方法:即获取c_boy
比c_girl
少的id
def classroom(request):
resaults = Classroom.objects.filter(c_boy__gt=F('c_girl'))
for resault in resaults:
print(resault.id)
return HttpResponse('ok')
就可以打印出2和3
所以以后相对于自查询,我们就可以使用F对象
Q
- 可以对雕件进行封装
- 封装之后可以支持逻辑运算(与,或 ,非)
还是上面那个模型,这次我们获取c_boy
大于7的并且c_girl
小于等于20的
我们可以这样写:
resaults = Classroom.objects.filter(c_boy__gt=7).filter(c_girl__lte=20)
但是我们也可以这样写:
resaults = Classroom.objects.filter(Q(c_boy__gt=7) & Q(c_girl__lte=20))
可以再一个filter
中写条件
模型成员
-
显性属性
开发者手动书写的属性 -
隐形属性
开发者没有书写,ORM自动生成的
如果你把隐形属性手动声明了,系统就不会为你产生隐形属性了
自定义管理器
有什么作用呢?
比如你在查询筛选中觉得某一个模型的处理方法很麻烦,你就可以自己定义一个模型中的方法来批量实现自己想实现的功能。在后期该程序是需要增量改的时候又不想大幅度该就可以用这种方法。
例如我们先建立一个模型,并且前面自己建立一个Manager
,定义它的get_queryset
方法中直接过滤出s_score
大于60的:
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(s_score__gt=60)
class Students(models.Model):
s_stu = models.CharField(max_length=16)
s_score = models.IntegerField(max_length=3)
objects = StudentsManager()
并填入几个数据:
在写入对应的方法:
def students(request):
stu = Students.objects.all()
for student in stu:
print(student.s_stu)
return HttpResponse('ok')
访问我们对应的网站即可显示出成绩大于60的学生:
由于前面的我们伪装的Manager
已经定义是过滤出s_score大于60
- 但这样做有什么用?
比如这样一个场景,之前查询的是所有的学生,在后来的维护中要修改只查询60分以上的学生,如果要是直接修改views中的方法,可能要修改很多地方。在后期修改代码时,要尽量避免修改原来已经写好的代码,以前我们可以使用装饰器来进行修改功能,在这里我们直接可以伪装成Manager
来实现修改之前调用方法的功能。
模型属性
- 字段类型
字段名称 | 字段说明 | 参数 |
---|---|---|
AutoField | ⼀个根据实际Id⾃动增⻓的IntegerField(通常不指定 ⾃动⽣成) | |
CharField | 字符串,默认的表单样式是TextInput | max_length=字符长度 |
TextField | ⼤⽂本字段,⼀般超过4000使⽤,默认的表单控件是Textarea | |
IntegerField | 整数 | |
DecimalField | 使⽤python的Decimal实例表示的⼗进制浮点数 | max_digits总位数;decimal_places⼩数位数 |
FloatField | ⽤Python的float实例来表示的浮点数 | |
BooleanField | true/false 字段,此字段的默认表单控制是CheckboxInputNullBooleanField ⽀持null、true、false三种值 | |
DateField | 使⽤Python的datetime.date实例表示的⽇期,该字段默认对应的表单控件是⼀个TextInput | auto_now和auto_now_add、default这三个参数不能同时共存 |
TimeField | 使⽤Python的datetime.time实例表示的时间 | 参数同DateField |
DateTimeField | 使⽤Python的datetime.datetime实例表示的⽇期和时间 | 参数同DateField |
ImageField | 继承了FileField的所有属性和⽅法,但对上传的对象进⾏校验,确保它是个有效的image |
- 字段选项
可选参数 | 说明 |
---|---|
null | 如果True ,Django将NULL 在数据库中存储空值。默认是False 。不要在字符串字段上使⽤。null是数据库范畴的概念 |
blank | 如果True ,该字段允许为空。默认是False 。同null不同,如果字段有blank=True ,则表单验证将允许输⼊空值。如果字段有blank=False ,则需要该字段。 |
db_column | ⽤于此字段的数据库列的名称。如果没有给出,Django将使⽤该字段的名称。 |
db_index | 如果True ,将为此字段创建数据库常规索引。 |
unique | 如果True ,该字段在整个表格中必须是唯⼀的。 |
primary_key | 如果True ,此字段是模型的主键。 |
default | 默认值 当前字段如果不给值则执⾏默认值 |