我有一个查询,该查询不会返回期望值,但是当我打印查询本身并在Dbshell中运行它时,它确实可以工作。我在使用SQLite 3.11.0的Django 1.8.18
我的推荐书的车上有一个外键,我需要用is_active=True
AND来获得所有没有推荐书的车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)
我创建了与我的汽车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的错误,但我希望您有意见
你在这里写什么,基本上是2联接:您排除Car
的是有一个对象Recommendation
是不是 is_active
和你进一步排除Car
有A S Recommendation
(不一定是相同的),有一个Recommendation
用description='FOO'
。但是这些建议本身并不相同。这是否定逻辑的结果。
EXISTS
如果要JOIN
遍历同一张表,可以使用EXISTS
子查询:
to_exclude = Recommendation.objects.filter(
car=OuterRef('pk'),
is_active=True,
description="FOO",
)
现在,我们可以exclude
将Car
S表示该等Recommendation
存在:
Car.objects.annotate(
has_recommendation_to_exclude=Exists(to_exclude)
).exclude(
has_recommendation_to_exclude=False
)
COUNT
-filter方法Car.objects.annotate(
nrec=Sum(
Case(
When(
recommendation__is_active=True,
recommendation__description="FOO",
then=Value(1)
),
default=Value(0),
output_field=IntegerField(),
)
)
).exclude(nrec__gt=0)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句