2010-10-24 1 views
3

У меня есть настройка формы Django с использованием метода GET. Каждое значение соответствует атрибутам модели Django. Какой был бы самый элегантный способ генерации запроса? В настоящее время это то, что я в представлении:Django: Создание запроса из запроса GET

def search_items(request): 
    if 'search_name' in request.GET: 
     query_attributes = {} 

     query_attributes['color'] = request.GET.get('color', '') 
     if not query_attributes['color']: del query_attributes['color'] 

     query_attributes['shape'] = request.GET.get('shape', '') 
     if not query_attributes['shape']: del query_attributes['shape'] 

     items = Items.objects.filter(**query_attributes) 

Но я уверен, что есть лучший способ пойти об этом.

ответ

6

Вы можете сделать это с помощью списка компе и и «заинтересованные Params» установить:

def search_items(request): 
    if 'search_name' in request.GET: 
     interested_params = ('color', 'shape') 
     query_attrs = dict([(param, val) for param, val in request.GET.iteritems() 
          if param in interested_params and val]) 

     items = Items.objects.filter(**query_attrs) 

Просто для удовольствия (он же не на самом деле это сделать) вы могли бы сделать это в одной строке:

def search_items(request): 
    items = Items.objects.filter(
     **dict([(param, val) for param, val in request.GET.iteritems() 
       if param in ('color', 'shape') and val]) 
    ) if 'search_name' in request.GET else None 
+0

+1 Как вы не можете любить понимание списка? –

+0

Просто убедитесь, что вы очищаете вход. –

+0

@ The Andrew Sledge: Какой вектор атаки вы предлагаете для очистки? – sdolan

1

ну, основной способ, которым вы приближаетесь к проблеме, кажется звуковым, но способ, которым вы его написали, выглядит немного забавным. Я бы, наверное, сделать это таким образом:

def search_items(request): 
    if 'search_name' in request.GET: 
     query_attributes = {} 

     color = request.GET.get('color', '') 
     if color: 
      query_attributes['color'] = color 

     shape = request.GET.get('shape', '') 
     if shape: 
      query_attributes['shape'] = shape 

     items = Items.objects.filter(**query_attributes) 
0

Если вы хотите, чтобы быть полностью динамическим, вы можете использовать немного модели самоанализа, чтобы выяснить, какие поля вы можете на самом деле запрос, и фильтровать только с помощью тех.

Хотя это решение не позволит вам использовать __lookups в параметрах GET, не знаю, если вам это нужно.

def search_items(request): 
    if 'search_name' in request.GET: 
     all_fields = Items._meta.get_all_field_names() 
     filters = [(k, v) for k, v in request.GET.items() if k in all_fields] 

     items = Items.objects.filter(*filters) 
0
def search_items(request): 
    try: 
     items = Items.objects.filter(**dict([ 
      (F, request.GET[F]) for F in ('color', 'shape') 
     ])) 

    except KeyError: 
     raise Http404 

требуется Пусть 'цвет' и 'форма' GET Params. Предопределенный кортеж фильтрующих параметров предпочтительнее из соображений безопасности.

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

  • Нет связанных вопросов^_^