python - 如何解决 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 个条件的查询:
- 如果 car_type 是 A,做 A`
- 如果 car_type 是 B,做 B`
- 如果 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()))
)
)
解决方案
您需要为所有情况提供 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()
)
)
推荐阅读
- python - 如何遍历列表并有条件地合并一些短语?
- sql - PostgreSQL按列分组
- mysql - hasMany() 关联不能在 Squelize.js 中定义?
- tensorflow - 这些列表必须采用什么格式才能被 Keras Tuners 搜索功能接受?
- amazon-s3 - S3 - 如果文件在 X 天前被删除,是否删除所有以前的版本?
- python - 在 Python 中进行单元测试时如何模拟依赖项的响应
- sharepoint - Sharepoint 应用程序以纯文本创建 .ICS 文件如何强制 HTML
- python - 如何用熊猫更改excel错误的数字格式
- c# - C# - 在 dataGridView 内部单击以获得更大的图片
- testing - 通用代理未显示在 qtest 自动化代理的代理类型下拉列表中