Django表单在很多对很多关系上都很慢

时间:2011-07-06 05:24:37

标签: python django formset

我有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视图。我需要提供一个formset,用于在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查询。有没有办法让Django不会为同样的事情运行这么多查询?

1 个答案:

答案 0 :(得分:1)

您应该使用Django Debug toolbar来分析执行的SQL。

也许 __ unicode __()方法可以对额外的查询负责吗?

一个选项是重新定义ModelForm子类,并在forms.ModelChoiceFields的queryset属性中显式添加 select_related()