美文网首页Django入门开发实战
Django模型层之多表操作(六)之F查询与Q查询

Django模型层之多表操作(六)之F查询与Q查询

作者: 乔治大叔 | 来源:发表于2019-01-25 17:01 被阅读27次

    F查询

    在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

    Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

    查询评论数大于收藏数的书籍

    from django.db.models import F
    Book.objects.filter(commnetNum__lt=F('keepNum'))

    Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。

    查询评论数大于收藏数2倍的书籍

    Book.objects.filter(commnetNum__lt=F('keepNum')*2)

    修改操作也可以使用F函数,比如将每一本书的价格提高30元:

    Book.objects.all().update(price=F("price")+30)

    Q查询

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

    from django.db.models import Q
    Q(title__startswith='Py')

    Q 对象可以使用& 和| 操作符组合起来。当一个操作符在两个Q 对象上使用时,它产生一个新的Q 对象。

    bookList=Book.objects.filter(Q(authors__name="yuan")|Q(authors__name="egon"))

    等同于下面的SQL WHERE 子句:

    WHERE name ="乔治十三世" OR name ="bgon"

    你可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询:

    查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。例如:

    bookList=Book.objects.filter(Q(publishDate__year=2016) | Q(publishDate__year=2017), title__icontains="python")

    # 查询评论数大于阅读数的书籍
        from django.db.models import F,Q
        # select * from book where commit_num>read_num;
        # 这样肯定是不行的
        # Book.objects.filter(commit_num__gt=read_num)
        ret=Book.objects.filter(commit_num__gt=F('reat_num'))
        print(ret)
        # 把所有书籍的价格加10
        Book.objects.all().update(price=F('price')+10)
        # ----Q函数,描述一个与,或,非的关系
        # 查询名字叫红楼梦或者价格大于100的书
        ret=Book.objects.filter(Q(name='红楼梦')|Q(price__gt=100))
        print(ret)
        # 查询名字叫红楼梦和价格大于100的书
        ret = Book.objects.filter(Q(name='红楼梦') & Q(price__gt=100))
        print(ret)
        # # 等同于
        ret2=Book.objects.filter(name='红楼梦',price__gt=100)
        print(ret2)
        # 也可以Q套Q
        # 查询名字叫红楼梦和价格大于100  或者 nid大于2
        ret=Book.objects.filter((Q(name='红楼梦') & Q(price__gt=100))|Q(nid__gt=2))
        print(ret)
        # ----非
        ret=Book.objects.filter(~Q(name='红楼梦'))
        print(ret)
        # Q和键值对联合使用,但是键值对必须放在Q的后面(描述的是一个且的关系)
        # 查询名字不是红楼梦,并且价格大于100的书
        ret=Book.objects.filter(~Q(name='红楼梦'),price__gt=100)
        print(ret)
    

    相关文章

      网友评论

        本文标题:Django模型层之多表操作(六)之F查询与Q查询

        本文链接:https://www.haomeiwen.com/subject/qckvjqtx.html