3

ユーザー、プロジェクト、ロールの 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 が同じことに対してこれほど多くのクエリを実行しないようにする方法はありますか?

4

1 に答える 1

1

実行された SQL を分析するには、 Django デバッグ ツールバーを使用する必要があります。

たぶん__unicode__()メソッドが余分なクエリを担当していますか?

サブクラスを再定義し、forms.ModelChoiceFieldsの queryset 属性にselect_related()ModelFormを明示的に追加するオプションがあります。

于 2012-07-16T22:00:45.697 に答える