Django表单集在多对多关系下变慢

3 投票
1 回答
1699 浏览
提问于 2025-04-16 20:55

我有三个模型之间的多对多关系,分别是用户(User)、项目(Project)和角色(Role)。一个用户可以参与多个项目,并且在同一个项目中扮演多个角色。这种关系在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)

我已经为每种对象创建了所有的增删改查视图。现在我需要在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 个回答

1

你可以使用Django调试工具栏来分析执行的SQL语句。

可能是__unicode__()这个方法导致了额外的查询?

一种解决办法是重新定义ModelForm的子类,并在表单的ModelChoiceFields的查询集中明确添加select_related()

撰写回答