Django 高级查询 F Q查询

F对象

之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。

语法如下:

F(属性名)
  • 例:查询阅读量大于等于评论量的图书。

    from django.db.models import F
    
    BookInfo.objects.filter(readcount__gt=F('commentcount'))
    <QuerySet [<BookInfo: 雪山飞狐>]>
    

可以在F对象上使用算数运算。

  • 例:查询阅读量大于2倍评论量的图书。

    BookInfo.objects.filter(readcount__gt=F('commentcount')*2)
    <QuerySet [<BookInfo: 雪山飞狐>]>
    

Q对象

多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。

  • 例:查询阅读量大于20,并且编号小于3的图书。

    BookInfo.objects.filter(readcount__gt=20,id__lt=3)
    <QuerySet [<BookInfo: 天龙八部>]>
    

    或者

    BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3)
    <QuerySet [<BookInfo: 天龙八部>]>
    

如果需要实现逻辑或or 的查询,需要使用Q()对象结合 | 运算符,Q对象被义在django.db.models中。

语法如下:

Q(属性名__运算符=)
  • 例:查询阅读量大于20的图书,改写为Q对象如下。

    BookInfo.objects.filter(Q(readcount__gt=20))
    

Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。

  • 例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现

    BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
    <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>
    

Q对象前可以使用~操作符,表示非not。

  • 例:查询编号不等于3的图书。

    BookInfo.objects.filter(~Q(id=3))
    <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>
    
发布了125 篇原创文章 · 获赞 260 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/weixin_44685869/article/details/105399870