我有一个查询,该查询不会返回期望值,但是当我打印查询本身并在Dbshell中运行它时,它确实可以工作。我在使用SQLite 3.11.0版本的Django 1.8.18
我的推荐书上有一个外键,我需要用is_active=True
和description=FOO
来获得所有没有推荐书的汽车。我知道我可能可以用其他方式使它工作,但是对我来说,以这种方式工作会更容易。
class Car(models.Model):
kind = models.CharField(max_length=100)
class Recommendation(models.Model):
car = models.ForeignKey(Car)
is_active = models.BooleanField(default=True)
description = models.CharField(max_length=100)
我创建了一个链接到我的Car ID 100的推荐,is_active设置为False,描述为FOO
Car.objects.exclude(recommendation__is_active=True, recommendation__description="FOO")
当我希望它返回Car 100时,该查询什么也不会返回。我决定打印实际查询并在dbshell中尝试
SELECT "myapp_car"."id"
FROM "myapp_car"
WHERE NOT ("myapp_car"."id" IN (SELECT U1."car_id" AS Col1 FROM "myotherapp_recommendation" U1 WHERE U1."description" = 'FOO') AND "myapp_car"."id" IN (SELECT U1."car_id" AS Col1 FROM "myotherapp_recommendation" U1 WHERE U1."is_active" = 'True'))
但是,这正常工作!它给我我的Car 100
我也尝试过Q,但是它也不起作用
Car.objects.exclude(Q(recommendation__is_active=True) & Q(recommendation__description="FOO"))
感觉像是Django的错误,但我希望您有意见
答案 0 :(得分:0)
您在这里写的基本上是两个 联接:您排除了Car
对象,而这些对象的{<1>}不是 {{1 }},并且您进一步排除了具有Recommendation
(不一定相同),具有is_active
和Car
的{{1}}。但是这些建议本身并不相同。这是负逻辑的结果。
Recommendation
如果我们想在相同表上Recommendation
,则可以使用description='FOO'
子查询:
EXISTS
现在我们可以JOIN
EXISTS
存在的to_exclude = Recommendation.objects.filter(
car=OuterRef('pk'),
is_active=True,
description="FOO",
)
:
exclude
Car
过滤器方法Recommendation