【发布时间】:2013-05-18 06:14:24
【问题描述】:
我正在 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()
有些首选项有默认状态,所以我需要能够问数据库两个问题:“哪些用户将此首选项设置为某个值?”和“哪些用户没有将此首选项设置为该值(因为他们没有设置首选项或因为他们主动将首选项设置为另一个值)?”
我的问题是前一个问题有效,但后一个问题(相同的查询子句,但使用exclude() 而不是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 来查看行为是否会有所不同,但结果是相同的。
【问题讨论】:
标签: django django-orm