HTTP-запрос Django get против поведения getlist - PullRequest
4 голосов
/ 04 февраля 2012

У меня была форма Django, которая представила список значений на мой взгляд. Сначала я попытался получить список с помощью метода get , но обнаружил, что он вернул только последний, и мне следует использовать getlist . После некоторого спотыкания я обнаружил закрытую ошибку Django , которая объясняла мотивы такого поведения:

Причина этого заключается в том, что метод API должен последовательно возвращать либо строку, либо список, но никогда оба. Обычно в веб-приложениях ключ формы ассоциируется с одним значением, поэтому синтаксис [] так и делает. getlist () используется для случаев (например, у вас), когда вы собираетесь использовать ключ несколько раз для одного значения.

Мне просто интересно, является ли это на самом деле лучшей практикой - это противоречит тому, как метод get работает с другими структурами данных, т.е. словари.

1 Ответ

8 голосов
/ 23 февраля 2012

HTTP-запросы поддерживают несколько значений, назначенных одному параметру (ключу).Вот почему люди могут использовать их и (иногда) использовать их.Именно поэтому Django представила структуру MultiValueDict.

Деление на get() и getlist() выгодно, поскольку помогает избежать ошибок и упрощает код представления.Рассмотрим другие варианты поведения: все они требуют больше кода, чтобы сделать то же самое:

  • get() всегда возвращающий список.

    В большинстве случаев вы передаете только одно значение одной клавише, поэтому вам нужно будет добавить [0] и указать значение по умолчанию в виде списка.

    param = request.GET.get('param', ['default value',])[0]

  • get() возврат одного значения или списка, в зависимости от количества значений.

Itявляется недостатком HTML-выбора с несколькими допустимыми параметрами.Люди могут выбрать ноль, одно или несколько значений.Это означает, что вам нужно преобразовать одно значение в список или в обратном направлении самостоятельно:

 params = request.GET.get('params', [])
 # Here you have absolutely no idea if this is a list or a single value
 # But you will need only one of that types

 # If you need list: ---------------------------------
 if not isinstance(params, list):
     params = [params,]

 objs = TestModel.objects.filter(id__in=params).all()

 # If you need single value: -------------------------
 if isinstance(params, list):
     params = params[0]   # Error if params is empty list...


obj = TestModel.objects.get(id=params)
  • get() всегда возвращая одно значение.Так как же вы обрабатываете несколько значений без getlist в этом случае?

Итак, для ответа на ваш вопрос есть дополнительная ценность поведения get/getlist.

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