0
0

DjangoのForeignKeyで親のフィールドを参照

Posted at

Djangoで外部キーを使うにはmodelに一対多のForeignKey 一対一のOneToOneFieldを指定する。
ここでは親モデルのUser, 子モデルのDataを作成することを考える。

データベース定義

User Data
id (primaary key) id (primary key)
user_name user (foreign key)
text

子モデルから親モデルを参照したい

例えばuser_nameがadminのDataを選択したいときdjangoでは2つの書き方がある。

python
Data.objects.filter(user=User.objects.get(user_name="admin")) #1
Data.objects.filter(user__user_name="admin") #2

#1はuserにUserモデルのオブジェクトを代入していて#2は __ を用いてuserの親クラスのフィールドを指定している。
それぞれ以下のようなSQL文が発行される

SQL
SELECT "data"."id", "data"."user", "data"."text", FROM "data" WHERE "data"."user_id" = 1 /* #1 */

SELECT "data"."id", "data"."user", "data"."text", FROM "data"
       INNER JOIN "user" ON ("data"."user_id" = "user"."id") 
            WHERE "user"."user_name" = "admin" /* #2 */

それぞれクエリを実行する時間を計測するとSQL文からも推測できるように
#1 : 0.0015730000004623435
#2 : 0.004858499999500054

となった。以上より#1を用いた方がよさそう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0