В Django, как можно фильтровать QuerySet с динамическими поисками полей?

Это то, что вы ищете?

Bitmap bmp = System.Drawing.Image.FromHbitmap(pBits);
144
задан Antti Haapala 25 December 2017 в 15:07
поделиться

3 ответа

Расширение аргумента Python может использоваться для решения этой проблемы:

kwargs = {
    '{0}__{1}'.format('name', 'startswith'): 'A',
    '{0}__{1}'.format('name', 'endswith'): 'Z'
}

Person.objects.filter(**kwargs)

Это - очень общая и полезная идиома Python.

279
ответ дан Daniel Naab 25 December 2017 в 15:07
поделиться
  • 1
    Don’t недооценивают, сколько идиоты там, и сколько из них преподает C++.;-) – Konrad Rudolph 24 June 2012 в 10:19

Действительно сложный поиск формируется, обычно указывает, что более простая модель пытается вырыть, это - выход.

, Как, точно, Вы ожидаете получать значения для имени столбца и операции? Где Вы получаете значения 'name' 'startswith'?

 filter_by = '%s__%s' % ('name', 'startswith')
  1. А "ищут" форму? Вы идете в - что? - выбирают имя из списка имен? Выбрать операцию из списка операций? В то время как открытый, большинство людей находит это сбивающим с толку и твердым к использованию.

    , Сколько столбцов имеет такие фильтры? 6? 12? 18?

    • Некоторые? Сложный список выбора не имеет смысла. Несколько полей и несколько операторов "if" имеют смысл.
    • большое количество А? Ваша модель не звучит правильной. Это кажется, что "поле" является на самом деле ключом к строке в другой таблице, не столбцом.
  2. Определенные кнопки фильтра. Ожидать... Это - способ, которым работает администратор Django. Определенные фильтры превращены в кнопки. И тот же анализ как выше применяется. Несколько фильтров имеют смысл. Большое количество фильтров обычно означает своего рода первое нарушение нормальной формы.

Много подобных полей часто означает, что должно было быть больше строк и меньше полей.

-1
ответ дан S.Lott 25 December 2017 в 15:07
поделиться
  • 1
    Если пространство поиска не является слишком большим, можно использовать исчерпывающий поиск (поиск сетки). Иначе можно искать большое дискретное пространство путем выбора функции района и использования некоторого локального алгоритма: локальный поиск, пороговое принятие, моделировал отжиг (@HansWerner' s ответ). Пороговое принятие подобно моделируемому отжигу, но более детерминировано: это сходится быстрее, но менее часто, и более чувствительно к выбору района. Необходимо протестировать с фактической функцией: моделируемый отжиг обычно намного медленнее, но ограничение на целые числа должно ускорить его. – Vincent Zoonekynd 20 June 2012 в 15:15

Упрощенный пример:

В Django рассматривают приложение, я хотел список выборки HTML, показывающий зарегистрированным пользователям. Но потому что у нас есть 5 000 зарегистрированных пользователей, мне был нужен способ отфильтровать тот список на основе условий запроса (такой как просто люди, которые завершили определенный семинар). Для элемента обзора, чтобы быть допускающим повторное использование, мне было нужно для человека, создающего вопрос об обзоре быть в состоянии присоединить те критерии к тому вопросу (не хотите к твердому коду запрос в приложение).

решение, которое я предложил, не на 100% удобно для пользователя (требует, чтобы справка от технического человека создала запрос), но это действительно решает проблему. При создании вопроса редактор может ввести словарь в пользовательское поле, например:

{'is_staff':True,'last_name__startswith':'A',}

, Что строка хранится в базе данных. В коде представления это возвращается в как self.question.custom_query. Значение этого является строкой что взгляды как словарь. Мы возвращаем его в реальный словарь с оценкой () и затем наполняем его в queryset с ** kwargs:

kwargs = eval(self.question.custom_query)
user_list = User.objects.filter(**kwargs).order_by("last_name")   
6
ответ дан shacker 25 December 2017 в 15:07
поделиться
  • 1
    Я указал бы на Вас на эту простую кавычку: в информатике существует 2 тяжелых проблемы: кэширование, именование и off-1 ошибки. и лично предпочитают использовать at и позволяют производительности удалить проверку, если это, как могут доказывать, является ненужным. – Matthieu M. 17 October 2013 в 09:21
Другие вопросы по тегам:

Похожие вопросы: