ORM的F与Q查找

有时候靠单一的关键字参数查询已经很难满足查询要求,此时就需要ORM的F和Q查询。


导入

from django.db.models import F
from django.db.models import Q

F查询

F查询——专门取对象中某列值的操作,不可使用__双下划线

# 对于book表中每本书的价格都在原价格的基础上增加20元
models.Book.objects.update(price=F("price")+20)

取到Book书中price一列值,并对每个值进行+20的操作


Q查询

Q查询——对对象的复杂查询

filter() 等方法中的关键字参数查询都是相当于进行“AND” 操作的。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。

关键字封装

#1 Q对象可以对关键字参数进行封装,从而更好地应用多个查询
q1=models.Book.objects.filter(Q(title__startswith='P')).all()
print(q1)#[<Book: Python>, <Book: Perl>]

使用操作符

# 可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
Q(title__startswith='P') | Q(title__startswith='J')

# Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
Q(title__startswith='P') | ~Q(pub_date__year=2015)

可使用Q对象的方法

  • filter()
  • exclude()
  • get()

注意事项

Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面

# 正确:
Book.objects.get(
Q(pub_date=date(2015, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
title__startswith='P')
# 错误:
Book.objects.get(
question__startswith='P',
Q(pub_date=date(2015, 5, 2)) | Q(pub_date=date(2005, 5, 6)))

-------------本文结束感谢您的阅读-------------