Django сделать запрос динамически для фильтра - PullRequest
1 голос
/ 13 марта 2020

этот код работает хорошо

from django.db.models import Q
filtered = Article.objects.filter(Q(authers__id=2) | Q(issues__id=1) | Q(issues__id=3) )

Однако теперь у меня есть такой список ниже, и я хочу сделать фильтр динамически.

ids = [1,2,3]
for id in ids:
    eachQ = Q(authers__id=isId)
#then......

как я могу сделать запрос ???

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Запрашивая одно и то же поле для различных значений (или условий), вы можете использовать клавишу __in.

 possibilities = [1,2,3]
 Article.objects.filter(field__in=posibilities)

Также для динамических c запросов вы можете передать ** kwargs в метод фильтрации:

query_key = 'your_field_name__in'
Article.objects.filter(**{query_key:[1,2,3]#your search value})

Вы можете добавить поле нескольких моделей в параметр kwargs:

query = {'field_1':value_1,'field_2':value_2,'field_3__contains':value_3}#for example
Article.objects.filter(**query)
1 голос
/ 13 марта 2020

Если у вас есть список значений только для одного поля, лучше использовать 'in' filter :

ids = [1,2,3]
articles = Article.objects.filter(authers__id__in=ids)

В противном случае, для итеративного создания фильтра OR :

from django.db.models import Q

filters = Q()
ids = [1, 2, 3]

for pk in ids:
    filters |= Q(authers__id=pk)

articles = Article.objects.filter(filters)

Может использоваться для динамической фильтрации c по нескольким полям и значениям модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...