Фильтр строительных объектов Django с параметрами GET - PullRequest
1 голос
/ 04 января 2012

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

/projects/?group=1&project_phase=

с пустым фильтром project_phase

или

/projects/?group=1&project_phase=2

с определенным фильтром проекта

имена являются именно атрибутамичто я могу определить в .filter ().

Я застрял с точки зрения объединения строки фильтра для фильтра - есть ли общий способ сделать это?

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Возможно, вы можете использовать:

parameters = {field_name: value for field_name, value in request.GET.items()
              if value and field_name in model._meta.get_all_field_names()}
model.objects.filter(**parameters)

Как предлагается в комментариях ниже, есть несколько проверок, чтобы игнорировать нежелательные параметры:

  • Пустые значения
  • Имена полей не определены в модели

Это должно передать все параметры в запросе GET методу filter, как вы ожидаете.

0 голосов
/ 04 января 2012

Вы также можете связать фильтры (это псевдо, но должно дать вам представление):

filter_mapping = dict()
filter_mapping['g'] = 'group'
filter_mapping['project'] = 'project_phase'
# .. etc...

o = Model.objects.all() # No filtering (default)

for k in request.GET.items():
  if k in filter_mapping.keys():
     o.filter(filter_mapping[k]=request.GET.get(k))
...