Django的F查询与Q查询

class Class(models.Model):

"""班级表"""

class_name = models.IntegerField()  # 班级名称

class_grade = models.IntegerField()  # 班级年纪

boy_num = models.IntegerField()  # 男生人数

girl_num = models.IntegerField()  # 女生人数

""""""""""""""""""""""""""""""""""""""""""""""""""""""""

from django.db.models import Q,F

""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Django中的F查询可在查询中引用同一模型的其他字段。

Class.objects.filter(boy_num__ge = F('girl_num'))用于筛选男生多于女生的班级

F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是自定义常量的条件了,实现了动态比较的效果

Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。基于此可以对表中的数值类型进行数学运算

例如:将所有男生人数多于女生人数的班级中男生人数减10:

Class.objects.filter(boy_num__ge = F('girl_num')).update(boy_num = F('boy_num') - 10)

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Django中的filter语句用逗号隔开的条件是与的意思,若需要执行更复杂的查询语句,如(or语句),则可以使用Q查询

例如:查询某个班级男生人数大于20或女生人数小于20

Class.objects.filter(Q(boy_num__gt = 20) | Q(girl_num_lt = 20))

查询男生人数大于20并且女生人数不小于20人的班级

不使用Q查询:Class.objects.filter(boy_num__gt = 20,girl_num__lt =20 )

使用Q查询:Class.objects.filter(Q(boy_num__gt = 20)&~Q(girl_num__lt =20))

混合使用:Class.objects.filter(Q(boy_num__gt = 20), girl_num__lt =20)

Q查询中:| 代表或操作,& 代表与操作,~ 代表非操作。

查询参数可以混合使用Q对象与关键字参数,所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。

defer('id','name'):取出对象,字段除了id和name都有
only('id','name'):取的对象,只有id和name
如果点,依然能点出其它列,但是不要点了,因为取没有的列,会再次查询数据库

class User(models.Model):
name = models.CharField(max_length=32)
password = MyCharField(max_length=32)
choices = ((1,'重点大学'),(2,'普通本科'),(3,'专科'),(4,'其他'))
education = models.IntegerField(choices=choices)

user_obj.education # 拿到的是数字
user_obj.get_education_display() # 固定用法 获取choice字段对应的注释

get_field_display()

猜你喜欢

转载自www.cnblogs.com/wangqingjiang/p/11811994.html