将过滤器链接在一起

时间:2014-11-06 23:19:19

标签: python django django-models django-queryset

鉴于以下内容:

instances = Catalog.objects.filter(
                                Q(imdb_url=imdb_url)
                               |Q(isan=isan)
                               |Q(amg_video_id=amg_video_id)
)

我将如何以下列格式执行相同操作,将每个链接在一起:

instances = Catalog.objects.all()
if imdb_url:
    instances = instances.filter(imdb_url = imdb_url) # OR
if isan:
    instances = instances.filter(isan = isan) # OR
if amg:
    instances = instances.filter(amg = amg) # OR

以上给出了相当于:

instances = Catalog.objects.filter(imdb_url=imdb_url).filter(isan=isan).filter(amg=amg)

如何在第一个查询中执行Q的等效?

2 个答案:

答案 0 :(得分:1)

查询集的union运算符为|

instances = Catalog.objects.none()
if imdb_url:
    instances |= instances.filter(imdb_url=imdb_url)
if isan:
    instances |= instances.filter(isan=isan)
if amg:
    instances |= instances.filter(amg=amg)

答案 1 :(得分:1)

您可以使用Q相应地创建一个空的|=对象和OR或其他人:

q = Q()

if imdb_url:
    q |= Q(imdb_url=imdb_url)
if isan:
    q |= Q(isan=isan) 
if amg:
    q |= Q(amg=amg)

instances = Catalog.objects.filter(q)