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を用いた方がよさそう。