1. ホーム
  2. django

[解決済み] Django の QuerySet で、多対一の関係で "not exists" をフィルタリングする方法です。

2023-06-16 22:18:16

質問

このようなモデルが2つあります。

class User(models.Model):
    email = models.EmailField()

class Report(models.Model):
    user = models.ForeignKey(User)

実際には、各モデルは、この質問には関係のない、より多くのフィールドを持っています。

私は、'a'で始まる電子メールを持っていて、レポートを持っていないすべてのユーザーをフィルタリングしたいのです。さらに .filter().exclude() の基準を他のフィールドに基づいて設定します。

このようにアプローチしたい。

users = User.objects.filter(email__like = 'a%')

users = users.filter(<other filters>)

users = ???

私は、レポートが関連付けられていないユーザーをフィルタリングしたいと思います。どのようにしたらよいでしょうか。私が提示したようにこれが可能でない場合、別のアプローチは何ですか?

どのように解決するのですか?

注意: この回答は 2013 年に Django 1.5 用に書かれたものです。Django の新しいバージョンで動作する、より良いアプローチについては、他の回答を参照してください。

使用方法 isnull .

users_without_reports = User.objects.filter(report__isnull=True)
users_with_reports = User.objects.filter(report__isnull=False).distinct()

を使う場合 isnull=False を使うと distinct() は、結果の重複を防ぐために必要です。