Django formsets在多对多关系上很慢

问题描述:

我有3种模型之间的多对多关系,即用户,项目,角色。即使在同一个项目中,用户也可以在多个项目中扮演多个角色。这种关系是用Django中的以下类建模的,Django formsets在多对多关系上很慢

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不会为同样的事情运行这么多的查询。

+0

我想这是某种程度上与[这在邮件列表](http://groups.google.com/group/django-developers/browse_thread/thread/4c8fb46a670a6421) – vimukthi

+0

所以没有人回应这个?如果您的formset中有很多对象,看起来像是一个非常糟糕的性能问题。真的没有办法做这件事吗? – JamesD

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

也许一个__unicode __()方法是负责额外的查询?

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