2011-07-06 62 views
3

我有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

回答

1

您應該使用Django Debug toolbar來分析執行的SQL。

也許一個__unicode __()方法是負責額外的查詢?

一個選項是重新定義ModelForm子類,並在forms.ModelChoiceFields的queryset屬性中明確添加select_related()