0

私は、すべてのモデルがauth_userテーブル上で1対1の関係を持つようにモデルを設計しましたUser。参考までに、下の写真を貼り付けています

ここに画像の説明を入力してください

ここで、BasicDetails、Department、およびProjectテーブルにあるユーザー名に関連するすべてのデータを選択します。以下のクエリは結果を取得していません。

User.objects.select_related().get(username='user1')

誰かがこれについて私を助けることができますか?

-ヴィクラム

4

1 に答える 1

1

関係が逆であるため、効率を上げるためにprefetch_relatedを使用する必要があります(ユーザーから他のレコードにアクセスする必要があり、その逆ではありません)。

u = User.objects.prefetch_related('project_set', 'department_set', 'basicdetails_set').get(username='user1')

これは単一のクエリを生成しませんが、Djangoはキャッシュ技術を使用して効果的に可能なdbオーバーヘッドを少なくします。正しく思い出せば、4つのクエリが生成されます(レコードやインデックスなどの数によっては、4つのテーブルでの単一の結合が遅くなる可能性があります)。利点は、後続のリクエストでクエリが生成されないことです。たとえば、ユーザーのプロジェクトを取得するには、次のようにします。

u.project_set.all() #hits the db
u.project_set.all() #cached version, no db hit

詳細については、https: //docs.djangoproject.com/en/dev/topics/db/queries/#one-to-one-relationshipsを参照してください。

編集:何project_setですか?

プロジェクトモデルがこのように定義されている場合

class Project(models.Model):
    ...
    user = models.ForeignKey(User)

次にProject.objects.get(pk=1).user、プロジェクトインスタンスに関連付けられているユーザーにアクセスするために実行できますが、反対の方法(特定のユーザーのすべてのプロジェクトを取得する)を実行しますか?Djangoは、便宜上、他のモデルに'_set'プロパティを自動的に含めます。したがって、次のような特定のユーザーのプロジェクトを取得できます。

u = User.objects.get(pk=1)
user_objects = u.project_set.all()

ただし、この逆の関係の名前を明示的に設定する場合、djangoでは次のrelated_nameようなキーワード引数を使用してForeignKeyを定義できます。

class Project(models.Model):
    ...
    user = models.ForeignKey(User, related_name='projects')

これで、代わりにユーザーのプロジェクトにアクセスするために.project_set使用できます。.projects

u = User.objects.get(pk=1)
user_objects = u.projects.all()
于 2012-12-28T16:05:47.143 に答える