首页 > 解决方案 > 如何解决 django.core.exceptions.FieldError?

问题描述

我有 3 个模型

class Car(models.Model):
    owner = models.ForeignKey(Driver, on_delete=None)
    car_type = models.CharField(max_length=3, choices=car_type_choices)

class Ride(models.Model):
    pickup_time = models.IntegerField()
    dropoff_time = models.IntegerField()
    car = models.ForeignKey(Car, on_delete=models.CASCADE)

class Payment(models.Model):
    ride = models.ForeignKey(Ride, on_delete=models.CASCADE)
    amount = models.FloatField()

我必须编写一个具有 3 个条件的查询:

  1. 如果 car_type 是 A,做 A`
  2. 如果 car_type 是 B,做 B`
  3. 如果 car_type 是 C,做 C`

我编写了查询但得到了这个异常:django.core.exceptions.FieldError: Expression contains mixed types。您必须设置 output_field。

同样,当我评论第一个和第二个条件时,第三个作品,当我只评论第三个,第一和第二个作品但同时都不起作用。


q = Car.objects.annotate(
    extras=Case(
        When(car_type='A', then=Count('ride')),
        When(car_type='B', then=Sum(F('ride__dropoff_time') - F('ride__pickup_time'), output_field=FloatField())),
        When(car_type='C', then=Sum(F('ride__payment__amount'), output_field=FloatField()))
    )
)

标签: pythondjangodjango-queryset

解决方案


您需要为所有情况提供 output_field 并按照文档Value中的说明将单个表达式包装在其中。所以查询将是:

from django.db.models import Value

q = Car.objects.annotate(
    extras=Case(
        When(car_type='A', then=Value(Count('ride'))),
        When(car_type='B', then=Value(Sum(F('ride__dropoff_time') - F('ride__pickup_time'))),
        When(car_type='C', then=Value(Sum(F('ride__payment__amount'))),
        output_field=FloatField()
    )
)

推荐阅读