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

问题描述

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

我目前正在为旧的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()