我正在 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()
一些首选项具有默认状态,因此我需要能够向数据库询问两个问题:“哪些用户将此首选项设置为某个值?” 和“哪些用户没有将此首选项设置为该值(因为他们没有设置首选项,或者因为他们主动将首选项设置为另一个值)?”
我的问题是前一个问题有效,但后一个问题(相同的查询子句,但使用 aexclude()
而不是 a filter()
)不起作用。例如:
我的测试数据库有 14 个用户,单个用户有两个首选项集:'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
查看行为是否会有所不同,但结果是相同的。