как решить django.core.exceptions.FieldError? - PullRequest
0 голосов
/ 19 июня 2019

у меня 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: Выражение содержит смешанные типы. Вы должны установить поле 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()))
    )
)

1 Ответ

0 голосов
/ 19 июня 2019

Вам необходимо предоставить 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()
    )
)
...