4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DjangoのModelでleft outer join

Posted at

きっかけ

地味に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みたいなこともできない)

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?