Встроенные наборы форм и поля выбора Django генерируют слишком много запросов к базе данных - PullRequest
7 голосов
/ 06 марта 2012

У меня есть модель с несколькими полями внешнего ключа, например, Модель Продукт с полями «тип», «уровень», «цвет», «интенсивность» (просто общий пример).

Затем у меня есть страница для редактирования всех продуктов данного типа с использованием формы Type с продуктами в качестве встроенного набора форм с возможностью добавления дополнительных продуктов, используя extra=10.

Я нахожу очень странным то, что каждый раз, когда я выводю одно из полей выбора внешнего ключа в шаблоне, Django запрашивает базу данных для получения опций (каждый раз).

Например:

{% for form in formset %}
    {{ form.level }}
    {{ form.color }}
    {{ form.intensity }}
{% endfor %}

С 20 продуктами (и 10 пустыми дополнительными формами) приведенный выше код выдает 30 select * from ... от уровня, цвета и интенсивности, что составляет 90 запросов (выявленных с помощью Django Debug Toolbar), где 3 должно быть достаточно. Параметры вряд ли изменят средний запрос, но даже если бы они это сделали, я бы не хотел, чтобы некоторые новые добавленные параметры отображались только в последних 5 формах.

Есть ли способ оптимизировать мои модели / формы / представления / шаблоны, чтобы база данных не забивалась таким образом без необходимости?

-

Отказ от ответственности: я относительно новичок в django и python и не могу не думать, что должен быть способ как-то решить эту проблему.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2013
field_queryset = Test.objects.all()    
for form in formset:
        form.fields['test_field'].queryset = field_queryset

Как это.

2 голосов
/ 06 марта 2012

Вы можете изменить набор запросов, используемый набором форм , затем вы можете использовать select_related () для генерации соединений FK, а не для выполнения запроса на каждой итерации forloop.

...