Я пишу простую форму поиска для определенной модели. Давайте назовем модель Orchard
и присвоим ей атрибуты apples
, oranges
и pears
только для демонстрации.
Итак, форма не требует заполнения всех полей. Таким образом, вы можете искать на apples
и oranges
, но не груши. Мне их нужно отфильтровать так:
Orchard.objects.filter(apples=request.GET.get('apples'), oranges=request.GET.get('oranges'), pears=request.GET.get('pears'))
но если pears
пусто, результаты никогда не вернутся.
Моей первой мыслью было использование Q
объектов, что-то вроде этого:
from django.db.models import Q
options = {}
options['apples'] = request.GET.get('apples')
options['oranges'] = request.GET.get('oranges')
options['pears'] = request.GET.get('pears')
queries = None
for key in options:
if options[key] != u'':
if queries:
queries &= Q(key=options[key]) # <=== problem here
else:
queries = Q(key=options[key]) # <=== same problem here
results = Orchard.objects.filter(queries)
Проблема возникает в этих отмеченных линиях. Я, очевидно, не могу просто использовать «ключ» в качестве ключевого слова атрибута, потому что он не принимает строку, он по существу принимает переменную.
Итак ... как мне обойти это?
Если нет известного решения этой проблемы, не включающего Q
. Это тоже было бы полезно.