Django でまばらな設定テーブルを作成しています。私のモデルは単純です:
class Preference(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='preferences')
preference = models.CharField(max_length=255, db_index=True)
value = models.BooleanField()
一部のプリファレンスにはデフォルトの状態があるため、データベースに次の 2 つの質問をする必要があります。「このプリファレンスを特定の値に設定しているユーザーは誰ですか?」および「この設定をその値に設定していないユーザーは?
私の問題は、前者の質問は機能しますが、後者の質問 (同じクエリ句ですが、 a のexclude()
代わりに a を使用filter()
) は機能しないことです。例えば:
私のテスト データベースには 14 人のユーザーがいて、1 人のユーザーに 2 つのプリファレンス セットが'PREF_A'
ありTrue
ます。'PREF_B'
False
>>> User.objects.all().count()
14
>>> User.objects.filter(preferences__preference="PREF_A", preferences__value=True).count()
1
>>> User.objects.exclude(preferences__preference="PREF_A", preferences__value=True).count()
13
>>> User.objects.filter(preferences__preference="PREF_A", preferences__value=False).count()
0
>>> User.objects.exclude(preferences__preference="PREF_A", preferences__value=False).count()
13
したがって、私の結果は次のように述べています。
全部で 14 人のユーザーがいます
1 人のユーザーが PREF_A を True に設定しています
13 人のユーザーが PREF_A を True に設定していません
0 人のユーザーの PREF_A が False に設定されています
13 人のユーザーが PREF_A を False に設定していません <--- これは不正確です
このクエリのどこが間違っているのでしょうか? また、特定の設定が特定の値に設定されているユーザーを適切に除外するクエリを作成するにはどうすればよいでしょうか?
動作が異なるかどうかを確認するためにと を使用してみQ
ましたが、結果は同じでした。~Q