F对象:
from django.db.models import F,Q
主要是两个字段直接比较时,需要用F对象:
models.Book.objects.filter(bread_num__gte=F('bcomment_num'))
F对象后面可以进行数学运算,更新数据库某个字段时也可以使用:
models.Book.objects.filter(bread_num__gte=F('bcomment_num')*2)
F对象的参数也可以是跨表字段:
models.Book.objects.filter(bread_num=F('author_name'))
F对象的参数如果为date/time时,可以使用timedelta进行日期的加减运算:
models.Book.objects.filter(bpub_date__lt=F('bpub_date') + timedelta(days=5))
Q对象
两个字段之间需要使用逻辑或时,需要引入Q对象:
models.Book.objects.filter(Q(bread_num__gt=10)|Q(bcomment_num__lt=15))
如果要对Q对象取反,只需要加'~':
models.Book.objects.filter(~Q(bread_num__gt=10)|Q(bcomment_num__lt=15))
Q对象可以使用&(and)、|(or)操作符组合起来;
当操作符应用在两个Q对象时,会产生一个新的Q对象;
可以使用&|~结合括号进行分组,构造更复杂的Q对象;
filter函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and;
filter函数可以混合使用Q对象和关键字参数,所有参数都将and在一起,Q对象必须位于关键字参数的前面;