私は、すべてのモデルがauth_userテーブル上で1対1の関係を持つようにモデルを設計しましたUser
。参考までに、下の写真を貼り付けています
ここで、BasicDetails、Department、およびProjectテーブルにあるユーザー名に関連するすべてのデータを選択します。以下のクエリは結果を取得していません。
User.objects.select_related().get(username='user1')
誰かがこれについて私を助けることができますか?
-ヴィクラム
関係が逆であるため、効率を上げるために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()