始终是真Q对象

use*_*125 11 django django-orm django-q

我想创建一些Django ORM过滤器查询的一部分,现在我可以这样做:

if some:
   Obj.filter(
       some_f1=some_v1,
       f1=v1,
       f2=v2,
       f3=v3,
       f4=v4,
       ...
   )
else:
   Obj.filter(
       f1=v1,
       f2=v2,
       f3=v3,
       f4=v4,
       ...
   )
Run Code Online (Sandbox Code Playgroud)

我希望没有代码重复的东西像这样:

Obj.filter(
    Q(some_f1=some_v1) if some else True,  # what to use instead of True?
    f1=v1,
    f2=v2,
    f3=v3,
    f4=v4,
    ...
)
Run Code Online (Sandbox Code Playgroud)

Fli*_*imm 12

这是一个获得永远真正的Q对象的hacky方法:

always_true = ~Q(pk=None)
Run Code Online (Sandbox Code Playgroud)

这取决于主键不能为空的事实.

  • 优化器可以更好地处理“~Q(pk__in=[])”,并且不依赖于“pk”非空。 (2认同)