微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将相关模型与条件表达式一起使用

如何解决将相关模型与条件表达式一起使用

目标:在注释的条件表达式中使用相关的模型属性作为过滤器。

我目前正在为旧的Django应用添加一些功能,该应用存在一些设计问题,与我无关。经过一番研究,我发现条件表达式非常有用,这正是我所需要的。

但是我无法做到。

让我们有模型A,模型B和模型C。

class ModelA(models.Model):
    name=models.Charfield()
    reference=models.ForeignKey('app.ModelB')

class ModelB(models.Model):
    name=models.Charfield()

class ModelC(models.Model):
    name=models.Charfield()
    reference=models.ForeignKey('app.ModelB',related_name='some_reference')
    bool_field=models.BooleanField()

这就是我想做的:

ModelA.objects.all().annotate(some_field=When(Q(reference__some_reference__bool_field=True),then=F('reference_some_reference_name')))

这应该起作用,因为它是由python解释的,但是我从MysqL收到一些语法错误。 我究竟做错了什么?这有可能吗?

这就是我得到的:

django.db.utils.ProgrammingError: (1064,"You have an error in your sql Syntax; check the manual that corresponds to your MysqL server version for the right Syntax to use near 'WHEN `ParametrosPreciosProveedor`.`already_iva` = 1 THEN `ParametrosPreciosProve' at line 1")

在此示例中,“ ParametrosPreciosProveedor”是ModelC,“ already_iva”是bool_field。

解决方法

我会尝试删除注释的Whenthen部分。 Q对象会自动执行这些操作-您无需在Python中定义这些术语。

ModelA.objects.all().annotate(some_field=Q(reference__some_reference__bool_field=True),F('reference_some_reference_name')))

Check out the docs to see how to use Q()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。