2009-11-19 4 views
4

Скажем, у нас есть таблица dvd, где мы хотим найти price=14.99 и rating=18. Мы могли бы сделать:Добавление дополнительных параметров в Objects.filter (через Dict)?

#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.

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

ответ

3

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

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

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

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

7

Вместо:

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) 
Смежные вопросы