Добавление дополнительных параметров в Objects.filter (через Dict)? - PullRequest
4 голосов
/ 19 ноября 2009

Допустим, у нас есть таблица dvd, в которой мы хотим найти price=14.99 и rating=18. Мы могли бы сделать:

#Making some dictionary
dict1 = {}

#Adding some stuff
dict1['price']=14.99
dict1['rating']18

#Use dict as filter
dvd.objects.filter(**dict1)

Есть ли способ добавить дополнительные параметры, такие как:

dvd.objects.filter(title__icontains='the')

Я просто хотел бы добавить немного больше гибкости для пользователя, потому что в настоящее время он может выбирать, в каких полях он хотел бы искать, и точно указывать, что именно он хочет. Однако я бы хотел найти частичные совпадения, например, что делает __icontains. Я также хотел бы __gt, __lt.

Возможно ли это?

Ответы [ 2 ]

7 голосов
/ 19 ноября 2009

Вместо:

dict['price'] = 14.99

вы можете сделать что-то вроде этого:

dict['price__gte'] = 10
dict['price__lte'] = 15

Когда вы используете ** kwargs, следующее идентично:

Model.objects.filter(price__gte=10, price__lte=15)
# or
kwargs = {'price__gte': 10,
          'price__lte': 15}      
Model.objects.filter(**kwargs)
3 голосов
/ 19 ноября 2009

Я не уверен, что ты хочешь делать? Хотите отфильтровать дополнительные поля после начальных dvd.objects.filter(**dict1) ?? Если это так, вы можете просто сделать:

qs = dvd.objects.filter(**dict1)
qs.filter(title__icontains='the')

Помните, filter возвращает набор запросов, чтобы вы могли выполнять любые операции, которые вы хотите, так же, как вы бы dvd.objects.

Если вы имели в виду, что хотите добавить icontains к чему-то в dict, тогда вы можете просто назначить ключи в dict1 как price__icontains вместо price.

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