django Q和F查询

Q查询——对对象的复杂查询
F查询——专门取对象中某列值的操作

1、对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询,例如:

from django.db.models import Q

news=New.objects.filter(Q(question__startswith=‘What‘))

2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。

Q(question__startswith=‘Who‘) | Q(question__startswith=‘What‘)

3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合

Q(question__startswith=‘Who‘) | ~Q(pub_date__year=2005)

4、应用范围

Poll.objects.get(
Q(question__startswith=‘Who‘),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
等价于
SELECT * from polls WHERE question LIKE ‘Who%‘
AND (pub_date = ‘2005-05-02‘ OR pub_date = ‘2005-05-06‘)

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

正确:
Poll.objects.get(
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
question__startswith=‘Who‘)

错误:
Poll.objects.get(
question__startswith=‘Who‘,
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))

  • 使用 F()表达式 进行检索

    可以对同一个model的不同字段进行比较、计算(加减乘除)

     >>> from django.db.models import F
    
           # 检索Entry中 n_comments 数值比 n_pingbacks 的记录
       >>> Entry.objects.filter(n_comments__gt=F(‘n_pingbacks‘))
    
           # (计算范例) n_comments 数值比 n_pingbacks 多两倍的记录
       >>> Entry.objects.filter(n_comments__gt=F(‘n_pingbacks‘) * 2)
    
           # (使用双下划线跨越关系和F()类的例子)
           # 所有 authors的name 与 blog的name相同
       >>> Entry.objects.filter(authors__name=F(‘blog__name‘)) 
时间: 2024-10-27 13:34:48

django Q和F查询的相关文章

python3开发进阶-Django框架中的ORM的常用操作的补充(F查询和Q查询,事务)

阅读目录 F查询和Q查询 事务 一.F查询和Q查询 1.F查询 查询前的准备 class Product(models.Model): name = models.CharField(max_length=32) price = models.DecimalField(max_digits=10, decimal_places=2) # 库存数 inventory = models.IntegerField() # 卖出数 sale = models.IntegerField() def __s

Django ORM 之F、Q查询与事务

内容目录 一.F.Q查询 二.事务 三.only与defer 一.F.Q查询 """ Product表中的数据: 1 橡皮 2 2000 3000 2 铅笔 3 12 200 3 华为保时捷 18000 30 23 4 索尼A6000 3680 24 12 """ # 查询卖出数大于50的商品 # res = models.Product.objects.filter(maichu__gt=50) # <QuerySet [<Prod

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

Django框架08 /聚合查询、分组、F查询和Q查询、执行原生sql、设置 sql_mode

目录 Django框架08 /聚合查询.分组.F查询和Q查询.执行原生sql.设置 sql_mode 1.聚合查询 2.分组 3.F查询和Q查询 4.执行原生sql(了解) 5.展示sql的 6.设置 sql_mode Django框架08 /聚合查询.分组.F查询和Q查询.执行原生sql.设置 sql_mode 1.聚合查询 aggregate(*args, **kwargs) aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典.键的名称是聚合值

django Q查询

Q查询--对对象的复杂查询.F查询--专门取对象中某列值的操作. Q查询: 1.Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询,例如: from django.db.models import Q from login.models import New #假设在我的login app的models.py下有New数据类 new=New.objects.filter(Q(question__startswith='What')) 2.可以组合使用&

Django ORM的F Q和extra操作

orm的F功能 假设数据库有一个员工表,表中的年龄都自加"1",这里就需要到orm的F功能,如下面的代码: from django.db.models import F#首先要导入这个F模块 models.Uinfo.objects.all().update(age=F("age")+1)#这里的F功能后面的age,它就会让数据表表中的age这列+1 F 就是用来更新获取原来值的功能 orm的Q功能 数据库的查询条件我们可以使用filter,在filter里面的可以

F查询和Q查询,摘自李文周老师

F查询和Q查询 F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较.F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值. 示例1: 查询评论数大于收藏数的书籍 from django.db.models import F models.Book.objects.filter(commnet_num__gt=F('keep_num')) Django

orm聚合查询、分组查询、F查询和Q查询

1.聚合查询(Avg,Count,Max,Min,Sum) Avg为求平均数,Count为求个数,Max为求最大值,Min为求最小值,Sum为求和 以Avg举例 from django.db.models import Avg,Count,Max,Min,Sum ret=Book.objects.all().aggregate(Avg('price')) //其中price必须是以有的字段 2.分组查询 ? 要点: ? values在annotate前,表示group by,在annotate后

django中的F和Q

F查询 Django 提供 F() 来做这样的比较.F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值. 查询书id大于\小于价格的书籍 1 models.Book.objects.filter(id__gt=F("price")) 2 <QuerySet []> 3 4 models.Book.objects.filter(id__lt=F("price")) 5 <QuerySet [<Book: 书一&