在Django中动态构建Q过滤器,使用AND和OR操作符?



我有一个文章的数据库表,其中包括一个字段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)
)

最新更新