【发布时间】:2012-08-01 20:02:39
【问题描述】:
我们在 Django 中遇到了一个关于 Q 对象求反的非常奇怪的问题。让我们以足球为例:
class Team(models.Model):
id = UUIDField(primary_key=True)
class Player(models.Model):
id = UUIDField(primary_key=True)
name = models.CharField(max_length=128)
team = models.ForeignKey(Team)
touchdowns = models.IntegerField()
有 10 个团队。
有 100 名玩家,每队 10 人。每支球队都有一名名叫“乔”的球员。一支球队中有一名“乔”获得了 5 次达阵。所有其他乔的得分为 1 次达阵。有 8 支球队,每名球员只有 1 次达阵。
我想要拥有一位名叫 Joe 且至少有 3 次达阵得分的球队。
models.Team.objects.filter(Q(player__name="Joe", player__touchdowns__gte=3)).count()
应该返回 One。否定应该返回 9(其他 9 支没有名为 Joe 且至少有 3 次达阵的球队):
models.Team.objects.filter(~Q(player__name="Joe", player__touchdowns__gte=3)).count()
而是返回该团队中每个人的达阵次数少于 3 (8) 的任何团队。
我哪里错了?请注意,我们的实际应用要复杂得多,所以我们需要使用带否定的 Q 对象,我们不能使用 Exclude。
【问题讨论】:
-
我当然认为这是一个错误,因为 filter(Q(
)) 预计会返回 filter(~Q( )) 和 exclude(Q( ))。在code.djangoproject.com/ticket/16893code.djangoproject.com/ticket/19672code.djangoproject.com/ticket/24705 报告了几个相关的错误,但它们都与崩溃相关,而不是像您的情况那样“错误的过滤器”。 FWIW,我在 Django 1.8.7 上遇到了类似的问题
标签: django django-queryset django-orm django-q