Как превратить Django QueryDict в список Django ORM ИЛИ фильтров? - PullRequest
1 голос
/ 28 февраля 2020

Я хотел бы превратить это: http://127.0.0.1: 8000 / fields_data /? Field_name__exact = 053 & field_name__exact = 064

в это:

fields = Fields.objects.filter(Q(field_name__exact='053')| Q(field_name__exact=field'064))

Там может быть дополнительными числами field_name__exacts, это не известно до времени выполнения.

В views.py я могу легко превратить URL в QueryDict, потому что request.GET уже является объектом QueryDict. Согласно документам, QueryDict был разработан так, чтобы одно и то же имя ключа могло использоваться с несколькими значениями, что является общим шаблоном в URL.

Затем я пытаюсь превратить QueryDict во что-то, совместимое с ** kwargs, путем используя: fields = serialize('geojson', Fields.objects.filter(**request.GET.dict())), но request.GET.dict () выглядит так: {'field_name__exact': ['053', '064']}. В результате я получаю только второй объект.

Я начинаю подозревать, что мне может понадобиться написать что-то более сложное, включающее в себя понимание, но я чувствую, что я действительно близок. Может ли кто-нибудь помочь мне с правильным синтаксисом превратить QueryDict (многозначные ключи) в OR-набор Q ()?

1 Ответ

0 голосов
/ 28 февраля 2020

Вы можете использовать понимание списка здесь:

from django.db.models import Q

Fields.objects.filter(
    Q(*[(k,v) for k,vs in request.GET.lists() for v in vs], <b>_connector=Q.OR</b>)
)

Затем будет выполнен запрос, который делает логическое ИЛИ между элементами в QueryDict.

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