Наборы форм Django медленны во многих отношениях - PullRequest
3 голосов
/ 06 июля 2011

У меня есть много ко многим ко многим отношениям между 3 моделями, а именно - Пользователь, Проект и Роль. Пользователь может участвовать в нескольких проектах, играя несколько ролей, даже в одном проекте. Это отношение моделируется следующими классами в Django:

class User(models.Model):
  name = models.CharField()

class Project(models.Model):
  name = models.CharField()

class Role(models.Model):
  name = models.CharField()

class UsersProjects(models.Model):
  user = models.ForeignKey(User)
  project = models.ForeignKey(Project)
  roles = models.ManyToManyField(Role)

Я уже создал все представления CRUD для каждого типа объекта. Мне нужно предоставить набор форм для добавления / редактирования пользовательских проектов-ролей в User режиме редактирования. И в представлении редактирования Project мне нужно предоставить набор форм для добавления / редактирования пользовательских ролей. Например, в представлении редактирования проекта я в основном сделал следующее:

projectedit_formset_class = inlineformset_factory(Project, UsersProjects)
project = Project.objects.get(id=2)
projectedit_formset = projectedit_formset_class(instance=project)

А потом в шаблоне:

<form method="post" action=".">
  {{ projectedit_formset.as_table }}
</form>

Здесь отображаются поля выбора для пользователя и поля множественного выбора для роли для каждого отношения пользователя и роли в проекте. Проблема в том, что, когда количество отношений роли пользователя увеличивается, время загрузки страницы растет безумно. Я знаю, что это происходит потому, что он запускает SQL-запрос каждый раз, когда ему нужно получить список пользователей и список ролей. Есть ли способ заставить Джанго не запускать столько запросов на одну и ту же вещь?

1 Ответ

1 голос
/ 17 июля 2012

Вам следует использовать панель инструментов Django Debug для анализа выполненного SQL.

Может быть, метод __ unicode __ () отвечает за дополнительные запросы?

Можно переопределить подкласс ModelForm и явно добавить select_related () в атрибуты набора запросов form.ModelChoiceFields.

...