F对象和Q对象

要从数据库中查找满足某种对比条件的样本时,会使用到Django中自带的F对象,但是需要手动导入这个模块.

1
2
gra = Grade.objects.filter(g_name='python').first()
stu = gra.stu_set.filter(stu_yuwen__gte=F('stu_shuxue'))

查询一个班级中语文成绩大于等于数学成绩的学生,需要知道的是如果是直接比较而不通过F对象的话,会直接出现小红线报错.

如果我要去查询同时满足多个条件的样本时,有两种方法,一种是直接用逗号分割条件,

1
2
3
gra = Grade.objects.filter(g_name='python').first()
stu =
gra.stu_set.filter(stu_yuwen__gte=80, stu_sex=0)

另外一种是使用Q查询对象,该对象不仅提供了’与’的运算,同时还支持’或’,’非’运算,

1
2
3
gra = Grade.objects.filter(g_name='python').first()
stu =
gra.stu_set.filter(Q(stu_yuwen__gte=80) & Q(stu_sex=0))

查询一个班级中语文成绩大于等于80并且性别为女生的样本,Q对象提供了&,|,~三种逻辑运算,所以可以很方便进行筛选查找,同样也需要手动导入.

也可以同时在一条查询语句中同时使用这两种对象,

1
2
gra = Grade.objects.filter(g_name='python').first()
stu = gra.stu_set.filter(Q(stu_yuwen__gte=F('stu_shuxue') + 10) & Q(stu_sex=1))

查询一个语文成绩大于等于数学成绩加10分并且性别是男生的样本.