本篇文章将讲述外键的定义,以及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_boyc_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')

就可以打印出23

所以以后相对于自查询,我们就可以使用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)


lass 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来实现修改之前调用方法的功能。
本文作者:Author:     文章标题:django学习笔记(4)- 模型成员,F,Q
本文地址:https://yuaneuro.cn/archives/44.html     
版权说明:若无注明,本文皆为“yuaneuro的小站”原创,转载请保留文章出处。
Last modification:June 29th, 2020 at 01:39 pm
如果觉得我的文章对你有用,请随意赞赏