2013-04-15 4 views
8

Как сделать фильтр в модели Django с помощью словаря, а не аргументов метода? Это то, что я прямо здесь:Модель фильтра Django по словарю

class StoreView(TemplateView): 

    def get(self, request): 

     # A bunch of gets 
     sort = request.GET.get('sort') 
     sort_price = request.GET.get('sort_price') 
     sort_mfr_method = request.GET.get('mfr_method') 

     # The params tpsort by 
     sort_params = {} 

     if sort is not None: 
      sort_params['sort'] = sort 

     if sort_price is not None: 
      sort_params['sort_price'] = sort_price 

     if sort_mfr_method is not None: 
      sort_params['sort_mfr_method'] = sort_mfr_method 

     # The Model Query 
     design_list = models.Design.objects.filter(sort_params) 

     # etc... 

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

sort_params['sort'] = sort if not None else '' 
+0

http://stackoverflow.com/questions/15949816/ use-string-variable-kwargs-as-named-argument –

ответ

15

Вы используете словарь, чтобы передать ключевые аргументы, как это:

models.Design.objects.filter(**sort_params) 

 

Там нет встроенного способа условно установить ключ Dict, но если вы сделаете это лот, вы можете написать свой собственный:

def set_if_not_none(mapping, key, value): 
    if value is not None: 
     mapping[key] = value 

class StoreView(TemplateView): 

    def get(self, request): 

     # A bunch of gets 
     sort = request.GET.get('sort') 
     sort_price = request.GET.get('sort_price') 
     sort_mfr_method = request.GET.get('mfr_method') 

     # The params tpsort by 
     sort_params = {} 

     set_if_not_none(sort_params, 'sort', sort) 
     set_if_not_none(sort_params, 'sort_price', sort_price) 
     set_if_not_none(sort_params, 'sort_mfr_method', sort_mfr_method) 

     # The Model Query 
     design_list = models.Design.objects.filter(**sort_params) 
+0

Это отлично работает! Это имеет смысл, потому что фильтрфильм, вероятно, близок к: 'filter (* args, ** kwargs)' Я просто никогда не понимал, что вы можете сделать выше, это потрясающе! благодаря – JREAM

4

abo Ответ правильный, и я предлагаю несколько более эффективный.

здесь request.GET является QueryDict Просто преобразовать его в словарь как этот

kwargs = dict(request.GET)

и теперь фильтровать

models.Design.objects.filter(**kwargs)

Смежные вопросы