Динамическое построение Q-фильтра в Django с помощью операторов 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)
)
Вернуться на верх