用于OR的Django复杂查询

use*_*391 2 python django django-queryset

我正在使用django 1.10

我创建了这个适用于我的查询:

filters_qs = filters_qs.filter(
    Q(
        user__in=[cache.user for cache in caches],
        status_id__in=[Status.Open['id'], Status.Empty['id']],
        revision=0
    ) |
    Q(
        user=None,
        status_id__in=[Status.Open['id'], Status.Empty['id']],
        revision=0
    )
)
Run Code Online (Sandbox Code Playgroud)

我使用'OR'因为我正在查找查询集为None或列表中的结果.但是 - 看起来不那么'pythonic'......它重复相同的代码以进行微小的改变.还有另外一种方法吗?例如,像 - (不起作用)

Q(
  user__in=[cache.user for cache in caches] + [None],
  status_id__in=[
      Status.Open['id'],
      Status.Empty['id']
      ],
  revision=0
  )
Run Code Online (Sandbox Code Playgroud)

谢谢.

SHI*_*DAL 5

您应该使用isnull查找来检查None值.试试这个:

filters_qs.filter(
    Q(user__in=map(lambda item: item.user, caches)) |
    Q(user__isnull=True),
    status_id__in=[
        Status.Open['id'],
        Status.Empty['id']
    ],
    revision=0
)
Run Code Online (Sandbox Code Playgroud)