Как динамически создать фильтр запросов OR в Django? - PullRequest
84 голосов
/ 12 мая 2009

Из примера вы можете увидеть фильтр нескольких запросов ИЛИ:

Article.objects.filter(Q(pk=1) | Q(pk=2) | Q(pk=3))

Например, это приводит к:

[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]

Однако я хочу создать этот фильтр запросов из списка. Как это сделать?

например. [1, 2, 3] -> Article.objects.filter(Q(pk=1) | Q(pk=2) | Q(pk=3))

Ответы [ 12 ]

1 голос
/ 02 августа 2014

Это для динамического списка ПК:

pk_list = qs.values_list('pk', flat=True)  # i.e [] or [1, 2, 3]

if len(pk_list) == 0:
    Article.objects.none()

else:
    q = None
    for pk in pk_list:
        if q is None:
            q = Q(pk=pk)
        else:
            q = q | Q(pk=pk)

    Article.objects.filter(q)
0 голосов
/ 18 декабря 2015

легко ..
из django.db.models import Q импортировать вашу модель args = (Q (visibility = 1) | (Q (visibility = 0) & Q (user = self.user))) #Tuple параметры = {} #dic order = 'create_at' предел = 10

Models.objects.filter(*args,**parameters).order_by(order)[:limit]
...