Django | ORM F与Q查询

F与Q查询

F查询

# F查询:能够帮助我们直接获取列表中某个字段对应的数据

# 举例:
1.查询卖出数大于库存数的书籍
# 使用我们之前所学的知识来看看是否可以完成
res = models.Book.objects.filter(maichu__gt=???)
# 我们可以看到我们之前在使用__gt方法作比较的时候都是给等号后面一个精确的值来做比较,那么现在比较的是一个未知数那么这时就无法做出比较,这里就要用到F查询的方法。

# 使用F查询方法
from django.db.models import F   # 需要导入模块
    # 1.查询卖出数大于库存数的书籍
    res = models.Book.objects.filter(maichu__gt=F('kucun'))  # 会拿到库存这个字段的每一个值进行比较
    print(res)

2.将所有书籍的价格提升50块。
models.Book.objects.update(price=F('price')+50)

3.将所有书的名称后面加上爆款两个字:
# 在操作字符类型的数据的时候 F不能够直接做到字符串的拼接
    from django.db.models import Value
    from django.db.models.functions import Concat
    models.Book.objects.update(name=Concat(F('name'),Value('爆款')))
   
# 注意:如果拼接字符串必须联合使用,
# models.Book.objects.update(title=F('title') + '爆款')  # 所有的名称会全部变成空白

Q查询

# 1.查询卖出数大于100或者价格小于600的书籍

res = models.Book.objects.filter(maichu__gt=100,price__lt=600)
print(res)


# 结论:filter括号内多个参数是and关系

# 使用Q查询的方法:
from django.db.models import Q   # 需要导入Q查询方法模块


res = models.Book.objects.filter(Q(maichu__gt=100),Q(price__lt=600))
print(res)   # 使用Q包裹后依然使用,做为多参数分割依然为and关系
res1 = models.Book.objects.filter(Q(maichu__gt=100)|Q(price__lt=600))
print(res1)	 # | 则表示的为or的关系
res2= models.Book.objects.filter(~Q(maichu__gt=100)|~Q(price__lt=600))
print(res2)  # ~ 表示的为非的关系(取反)

# Q的高级用法:能够将查询条件的左边也变成字符串的形式而不是变量名的形式。

q = Q()   # 可用Q()实例化产生一个空对象
q.children.append(('maichu__gt',100))  # 可以往children这个属性是一个列表,可无限添加元素
q.children.append(('price_lt',600))
res = models.Book.objects.filter(q)   # 默认还是and关系
q.connector = 'or'    # 可使用对象点connector属性的方式改变默认的and值
print(res)

posted @ 2022-03-04 16:27  JasonBorn  阅读(39)  评论(0编辑  收藏  举报