Django: Как использовать строку в качестве ключевого слова в операторе Q ()?

Пишу простую форму поиска по определенной модели. Назовем модель Орчард и дадим ей атрибуты яблоки , апельсины и груши просто для демонстрации.

Таким образом, форма не требует заполнения всех полей. Таким образом, вы можете выполнять поиск по яблокам и апельсинам , но не по грушам. Мне их нужно фильтровать следующим образом:

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 . Это тоже было бы полезно.

8
задан Kevin Brown 24 December 2014 в 22:24
поделиться