きっかけ
地味にDjangoのORMでLeft outer joinの情報が見つかりにくかったのでメモ。
DjangoのORMで結合といえば
よくselect_related()
と prefetch_related()
なんかを使ってモデルが外部キー指定している項目は引っ張ってこれる。
class User(models.Model):
name = models.CharField()
class Comment(models.Model):
user = models.ForeignKey(User, null=True)
content = models.CharField()
例えばこんなモデルが定義されている場合、次のように引っ張れる。
comment = Comment.objects.select_related().first()
print(comment.user.name)
1データを基準にするだけなら逆引きもできるらしい。
comments = User.objects.get(pk=1).comment_set.all()
# id=1のUserを保持するCommentを抽出できる
↑のようなことをやっているとDjangoの結合は大体Inner joinであることが分かってくる。
集計系の操作をやり始めて、outer joinってどうするの?ってなってくる。
left outer joinやり方
comments = Comment.objects.filter(user__isnull=True)
だそうです。
まとめ
一回調べたのに忘れたからメモった。
結合するには項目がmodels.ForeignKey()
で宣言されていることが重要。
(でないとcomment.user.nameみたいなこともできない)