【问题标题】:Using related models with conditional expression使用带有条件表达式的相关模型
【发布时间】:2020-12-08 03:52:36
【问题描述】:

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

我目前正在向一个旧的 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。

【问题讨论】:

    标签: python-3.x django django-rest-framework django-2.2 django-annotate


    【解决方案1】:

    我会尝试删除注释的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()

    【讨论】:

    • 它不起作用,F() 与该示例中的参数不匹配...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多