【问题标题】:Django formsets slow on many to many relationshipsDjango 表单集在多对多关系上变慢
【发布时间】:2011-09-29 07:57:27
【问题描述】:

我在 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 不为同一件事运行这么多查询?

【问题讨论】:

  • 我猜这与this on mailing lists有关
  • 所以没有人回应这个?如果您的表单集中有很多对象,这似乎是一个非常糟糕的性能问题。真的没有办法解决这个问题吗?

标签: python django formset


【解决方案1】:

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

也许 __unicode__() 方法负责额外的查询?

一种选择是重新定义ModelForm 子类并在forms.ModelChoiceFields 的查询集属性中显式添加select_related()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 2016-01-06
    • 2020-07-19
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多