Django中的F/Q表达式用于数据库操作。
1.F()表达式
Django使用F()
对象生成一个描述数据库级别操作所需的sql
语句,使用F()
对象可以直接引用模型字段的值并执行数据库操作而不用将它们导入到python的内存中,从而高效地完成批量数据操作。
如一般要操作数据,需:
employees = Employee.objects.filter(post="Manager")
for employee in employees:
employee.salary += 100
employee.save()
以上代码将数据从数据库中取出,放入内存中并使用python运算符操作,再将对象保存到数据库中,而若使用F表达式:
from django.db.models import F
employees = Employee.objects.filter(post="Manager")
employees.salary = F("salary")+100
employees.save()
其中虽然reporter.stories_field = F('stories_field') + 1
看起来像常规的python表达式,但实际上它是一个描述数据库操作的sql
结构。
当Django遇到F()
实例,会覆盖标准的python来创建封装的的sql
表达式,其中对数据的操作完全由数据库来处理,对于字段的值python完全不知道。
而通过F()
表达式处理的数据,必须重新加载后才能够获取其新值(即重新从数据中出选出):
employees = Employee.objects.filter(post="Manager")
或使用更简洁的操作:
employees.refresh_from_db()
而通过F()
与.update()
方法的结合,可以更加简便地更新数据:
Employee.objects.update(salary=F(“salary”)+1000)
需记住,
F()
表达式用于从数据库中加载数据的一步。
2.Q()表达式
对于筛选数据时的且
运算,可以同时传入多个条件来实现。而Q()
表达式,可以实现或|
、且&
、~非
等逻辑运算。
示例代码:
from django.db.models import Q
books = Book.objects.filter(Q(id=3)|Q(name__contains("记")))
books = Book.objects.filter(Q(price__get=100)&Q(name__contains("记")))
books = Book.objects.filter(Q(id=3)&~Q(name__contains="记"))
即
F()
表达式用于加载数据,Q()
表达式用于逻辑运算。