我在 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 查询。有什么办法可以让 Django 不为同一件事运行这么多查询?