Django查询不能在shell_plus中工作,但可以在dbshell中工作

伊拉努

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

我的推荐书的车上有一个外键,我需要用is_active=TrueAND来获得所有没有推荐书的车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时,该查询什么也不会返回。我决定打印实际查询并在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的错误,但我希望您有意见

威廉·范昂塞姆

你在这里写什么,基本上是2联接:您排除Car的是有一个对象Recommendation不是 is_active和你进一步排除Car有A S Recommendation(不一定是相同的),有一个Recommendationdescription='FOO'但是这些建议本身并不相同。这是否定逻辑的结果

EXISTS

如果要JOIN遍历一张表,可以使用EXISTS子查询:

to_exclude = Recommendation.objects.filter(
    car=OuterRef('pk'),
    is_active=True,
    description="FOO",
)

现在,我们可以excludeCarS表示该等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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

虚拟主机不能在邮递员中工作,但可以通过 CURL 访问

以编程方式将UIScrollView添加到UIView不能在viewDidLoad中工作,但可以在viewDidAppear中工作吗?

为什么我的正则表达式不能在c ++中工作,但可以在Python中工作?

body.req 未通过 bodyparser 接收 POST 参数事件。它不能在浏览器中工作,但可以在 POSTMAN 中工作

MySQL查询无法正常工作,但可以在PHPMyAdmin中工作

按钮上的填充不能在本地工作,但可以在JSFiddle上工作

样式表不能在线工作,但可以离线工作

Ubuntu 16.04不能从USB引导但可以在VM中工作

CSS不能在本地或远程网站上工作-但可以在jsfiddle上工作吗?

陷阱不能在shell脚本中工作?

rm无法从脚本中通过通配符删除文件,但可以在shell提示符下工作

javascript 代码不能在本地运行,但可以在 jsfiddle 中运行

查询可以在没有WHERE的情况下工作,但可以,但不能-“ LIMIT 0,25'in line 2”

IMG目录不能存储在db中,但可以从查询中使用的相同变量中查看

Java:不能对匿名内部类使用“<>”,不能在 IDE 中运行,但可以在终端中编译和运行

可以构建,但不能在netbeans中运行C代码(但可以在命令行中运行)

PhpMyAdmin无法在mozilla中打开,但可以在Chrome浏览器中工作

为什么JPA提交在Application中失败,但可以在JUnit中工作?

Shell命令可在Shell中工作,但不能在Shell脚本中工作

Spotify:发布到api /令牌提出了错误的请求,但可以在curl中工作

preg_match在脚本php中不起作用,但可以在线工作

图形卡未显示在设备管理器中,但可以工作

Flask 无法从邮递员或网页获取发布数据,但可以在 python 请求中工作

Web服务无法在Android Retrofit中工作,但可以在Postman和Swift / iOS中工作,未经授权就获得401

期待SIGSEGV,但可以正常工作

为什么如果在Django应用中直接查看URL,此图为什么不显示在模板中但可以正常工作?

wget 在终端中工作但不能在 shell 脚本中工作

导入包可在IPython Shell中工作,但不能在Jupyter Notebook中工作

MongoDB .find可在Shell中工作,但不能在js中工作