Django查询不能在shell_plus中工作,但可以在dbshel​​l中工作

时间:2018-06-20 10:06:37

标签: sql django sqlite

我有一个查询,该查询不会返回期望值,但是当我打印查询本身并在Dbshel​​l中运行它时,它确实可以工作。我在使用SQLite 3.11.0版本的Django 1.8.18

我的推荐书上有一个外键,我需要用is_active=Truedescription=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时,该查询什么也不会返回。我决定打印实际查询并在dbshel​​l中尝试

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的错误,但我希望您有意见

1 个答案:

答案 0 :(得分:0)

您在这里写的基本上是两个 联接:您排除了Car对象,而这些对象的{<1>}不是 {{1 }},并且您进一步排除了具有Recommendation(不一定相同),具有is_activeCar的{​​{1}}。但是这些建议本身并不相同。这是负逻辑的结果。

使用Recommendation

如果我们想在相同表上Recommendation,则可以使用description='FOO'子查询:

EXISTS

现在我们可以JOIN EXISTS存在的to_exclude = Recommendation.objects.filter( car=OuterRef('pk'), is_active=True, description="FOO", )

exclude

使用Car过滤器方法

Recommendation