1

我想在以下方面获得您的帮助:我有两个模型父模型和一个子模型:

class Rate(models.Model):
        RATE_VOLTAGE_CHOICES = (
            (BAJA_TENSION, "Low tension"),
            (MEDIA_TENSION, "Mid tension"),
            (ALTA_TENSION, "High tension")
        )
        rate_type = models.CharField(max_length=1, choices=RATE_TYPE_CHOICES, default="0")

class ParentRate(models.Model):
    rate = models.ForeignKey(Rate, on_delete=models.SET_NULL, blank=True, null=True

)

所以前端想要通过低张力,中张力和高张力“过滤”rate_type选择作为字符串,它们发送字符串所以我尝试使用When Case对象,以便我可以过滤:

rates = ParentRate.objects.annotate(rate_voltage=Case(
                    When(rate__rate_type=Rate.BAJA_TENSION, then=Value('Low tension')),
                    When(rate__rate_type=Rate.MEDIA_TENSION, then=Value('Mid tension')),
                    When(rate__rate_type=Rate.ALTA_TENSION, then=Value('High tension')),
                    default=Value('Low tension'),
                )

            )

但我收到以下错误:

django.core.exceptions.FieldError: Cannot resolve expression type, unknown output_field
4

2 回答 2

1

您需要output_field像以下示例一样向您的查询添加一个:

from django.db.models import fields


rates = ParentRate.objects.annotate(rate_voltage=Case(
                    When(rate__rate_type=Rate.BAJA_TENSION, then=Value('Low tension')),
                    When(rate__rate_type=Rate.MEDIA_TENSION, then=Value('Mid tension')),
                    When(rate__rate_type=Rate.ALTA_TENSION, then=Value('High tension')),
                    default=Value('Low tension'),
                    output_field=fields.CharField()  # if the output field is a string
                )

            )

有关更多信息:Django 文档:Aggregate() 表达式

于 2021-04-18T01:34:55.587 回答
1

如Aggregate() 表达式中所述

output_field 参数需要一个模型字段实例,如 IntegerField() 或 BooleanField(),Django 将从数据库中检索到的值加载到该实例中。

请注意,仅当 Django 无法确定结果应该是什么字段类型时,才需要 output_field。混合字段类型的复杂表达式应定义所需的 output_field。例如,将 IntegerField() 和 FloatField() 添加在一起可能应该定义 output_field=FloatField()。

在您的情况下,它将是 CharField

rates = ParentRate.objects.annotate(rate_voltage=Case(
                    When(rate__rate_type=Rate.BAJA_TENSION, then=Value('Low tension')),
                    When(rate__rate_type=Rate.MEDIA_TENSION, then=Value('Mid tension')),
                    When(rate__rate_type=Rate.ALTA_TENSION, then=Value('High tension')),
                    default=Value('Low tension'),
                    output_field=CharField()
                ),

            )
于 2021-04-18T01:35:23.363 回答