【问题标题】:The right way to make Q object, which filter all entries in Django QuerySet?制作Q对象的正确方法,过滤Django QuerySet中的所有条目?
【发布时间】:2015-09-18 14:11:17
【问题描述】:

现在我只使用Q(id=0),这取决于 DB。或者Q(pk__isnull=True) 更好?这对于使用| 运算符连接Q 对象很有用。

【问题讨论】:

    标签: django django-queryset django-q


    【解决方案1】:

    Q(pk__isnull=True) 更好,因为PRIMARY KEY 不能包含NULL 值。某些实例可能具有id=0

    【讨论】:

      【解决方案2】:

      其实在 Django QuerySet 中有一个特殊的方法。 Model.objects.none() 始终返回空查询集,更易于理解。

      【讨论】:

        【解决方案3】:

        查询优化器对Q(pk__in=[]) 的处理优于Q(pk__isnull=True)。例如:

        Model.objects.filter(Q(pk__in=[]) # doesn't hit the DB
        Model.objects.none() # doesn't hit the db
        Model.objects.filter(Q(pk__isnull=True)) # hits the DB
        

        如果甚至可以处理复杂的查询和波浪号否定:

        Model.objects.filter( (Q(pk__in=[]) & Q(foo="bar")) | Q(hello="world") )
        # simplifies condition to 'WHERE "hello" = world'
        
        Model.objects.filter( ~(~Q(pk__in=[]) & Q(foo="bar")) | Q(hello="world") )
        # simplifies condition to 'WHERE (NOT ("foo" = bar) OR "hello" = world)'
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-31
          • 2011-02-08
          • 2010-12-31
          • 1970-01-01
          • 2021-11-24
          • 1970-01-01
          • 2010-12-30
          相关资源
          最近更新 更多