使用AND和OR运算符在Django中动态构建Q过滤器?

我有一个文章数据库表,其中包含一个字段link,它是文章的链接。

我想过滤给定日期范围内的文章,这些文章来自给定列表中的域。

我有一个这样的字符串数组:

domain_names = [
    'domain_name_1',
    'domain_name_2',
    'domain_name_3',
    'domain_name_4',
]

...我有一个这样的过滤器:

data = (myArticles.objects
    .filter(Q(creation_datetime__range=[from_date, to_date]) & (Q(link__contains=domain_names[0]) | Q(link__contains=domain_names[1]) | Q(link__contains=domain_names[2]) | Q(link__contains=domain_names[3])))
    )

我想动态构建过滤器,以便如果在domain_names列表中添加或删除对象,过滤器将动态更新。

我试过这个:

q_object = Q()
    for name in domain_names:
        q_object.add(Q(link__contains=name), Q.OR)

    q_object = q_object.add(Q(creation_datetime__range=[from_date, to_date]), Q.AND)

...但我正在取回日期范围内的所有对象,并且应该对 domain_names 进行过滤的过滤器还没有做任何事情。

在这种情况下动态构建 Q 过滤器的正确方法是什么?

回答

您可以与:

q_object = Q(
    *[Q(link__contains=name) for name in domain_names],
    _connector=Q.OR
)

然后使用以下命令检索数据:

data = myArticles.objects.filter(
    q_object,
    creation_datetime__range=(from_date, to_date)
)


以上是使用AND和OR运算符在Django中动态构建Q过滤器?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>