2011-07-06 16 views
3

私は3つのモデル、つまりUser、Project、Roleの間に多対多の関係を持っています。ユーザーは、同じプロジェクトでも複数の役割を果たす複数のプロジェクトに参加することができます。この関係は、私はすでにオブジェクトの種類ごとに、すべてのCRUDビューを作成しました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) 

、ジャンゴに以下のクラスでモデル化されます。 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> 

これは、各USER-の役割のユーザーと複数選択フィールドの選択フィールドを表示しますプロジェクトにおける役割の関係。しかし、問題は、ユーザーとロールの関係の数が増えてページの読み込み時間が狂って増えることです。これは、ユーザーのリストとロールのリストを取得するたびにSQLクエリを実行するために発生します。 Djangoが同じことに対してこのように多くのクエリを実行しないようにする方法はありますか?

+0

[これはメーリングリストに関連しています](http://groups.google.com/group/django-developers/browse_thread/thread/4c8fb46a670a6421) – vimukthi

+0

誰もこれに応答していませんか?あなたのフォームセットにたくさんのオブジェクトがある場合、かなり悪いパフォーマンスの問題のように思えます。これについて実際に何かする方法はありませんか? – JamesD

答えて

1

Django Debug toolbarを使用して、実行されたSQLを分析する必要があります。

おそらく__unicode __()メソッドは余分なクエリの責任がありますか?

オプションはModelFormサブクラスを再定義し、明示的にforms.ModelChoiceFieldsのクエリセットの属性にselect_related()を追加することです。