F表达式
: 动态的获取某个字段上的值.而且这个F表达式,不会真正的去数据库中查询数据,它至关于只是起一个标识的做用.
F表达式是用来优化ORM操做数据库的。好比咱们要将公司全部员工的薪水都增长1000元,若是按照正常的流程,应该是先从数据库中提取全部的员工工资到Python内存中,而后使用Python代码在员工工资的基础之上增长1000元,最后再保存到数据库中。这里面涉及的流程就是,首先从数据库中提取数据到Python内存中,而后在Python内存中作完运算,以后再保存到数据库中。示例代码以下:javascript
employees = Employee.objects.all() for employee in employees: employee.salary += 1000 employee.save()
而咱们的F表达式就能够优化这个流程,他能够不须要先把数据从数据库中提取出来,计算完成后再保存回去,他能够直接执行SQL语句,就将员工的工资增长1000元。示例代码以下:html
from djang.db.models import F Employee.object.update(salary=F("salary")+1000)
F表达式并不会立刻从数据库中获取数据,而是在生成SQL语句的时候,动态的获取传给F表达式的值。java
好比若是想要获取做者中,name和email相同的做者数据。若是不使用F表达式,那么须要使用如下代码来完成:python
authors = Author.objects.all() for author in authors: if author.name == author.email: print(author)
若是使用F表达式,那么一行代码就能够搞定。示例代码以下:ios
from django.db.models import F authors = Author.objects.filter(name=F("email"))
Q表达式
: 使用Q
表达式包裹查询条件,能够在条件之间进行多种操做.于或非等,从而实现一些负责的查询操做
若是想要实现全部价格高于100元,而且评分达到9.0以上评分的图书。那么能够经过如下代码来实现:web
books = Book.objects.filter(price__gte=100,rating__gte=9)
以上这个案例是一个并集查询,能够简单的经过传递多个条件进去来实现。
可是若是想要实现一些复杂的查询语句,好比要查询全部价格低于10元,或者是评分低于9分的图书。那就没有办法经过传递多个条件进去实现了。这时候就须要使用Q表达式来实现了。示例代码以下:数据库
from django.db.models import Q books = Book.objects.filter(Q(price__lte=10) | Q(rating__lte=9))
以上是进行或运算,固然还能够进行其余的运算,好比有&和~(非)等。一些用Q表达式的例子以下:django
from django.db.models import Q # 获取id等于3的图书 books = Book.objects.filter(Q(id=3)) # 获取id等于3,或者名字中包含文字"记"的图书 books = Book.objects.filter(Q(id=3)|Q(name__contains("记"))) # 获取价格大于100,而且书名中包含"记"的图书 books = Book.objects.filter(Q(price__gte=100)&Q(name__contains("记"))) # 获取书名包含“记”,可是id不等于3的图书 books = Book.objects.filter(Q(name__contains='记') & ~Q(id=3))