Я должен написать код, чтобы найти всех водителей (id) и количество поездок (n) для тех водителей с этими Условиями: n: количество поездок, которое в модели этих поездок составляет x или больше И продолжительность поездки больше, чемt секунд.
Мои модели:
class Rider(models.Model):
account = GenericRelation(Account, related_query_name='riders')
rating = models.FloatField()
x = models.FloatField()
y = models.FloatField()
class Driver(models.Model):
account = GenericRelation(Account, related_query_name='drivers')
rating = models.FloatField()
x = models.FloatField()
y = models.FloatField()
active = models.BooleanField(default=False)
class RideRequest(models.Model):
rider = models.ForeignKey(Rider, on_delete=models.CASCADE)
x = models.FloatField()
y = models.FloatField()
car_type = models.CharField(max_length=3, choices=car_type_choices)
class Car(models.Model):
owner = models.ForeignKey(Driver, on_delete=None)
car_type = models.CharField(max_length=3, choices=car_type_choices)
model = models.IntegerField()
color = models.CharField(max_length=10)
class Ride(models.Model):
pickup_time = models.IntegerField()
dropoff_time = models.IntegerField()
car = models.ForeignKey(Car, on_delete=models.CASCADE)
request = models.OneToOneField(RideRequest, on_delete=models.CASCADE, null=False)
rider_rating = models.FloatField()
driver_rating = models.FloatField()
Мой код:
drivers = Driver.objects.values('id').annotate(
travel_time=Sum(Case(
When(car__ride__pickup_time__isnull=False,
then=(F('car__ride__dropoff_time') - F('car__ride__pickup_time'))),
default=0
)),
).annotate(
n=Case(
When(Q(travel_time__gt=t) & Q(car__model__gte=n), then=Count('car__ride')),
output_field=IntegerField(),
default=0
)
).values('id', 'n')
Когда я печатаю результат:
<QuerySet [{'id': 1, 'n': 0}, {'id': 2, 'n': 0}, {'id': 2, 'n': 1}, {'id': 3, 'n': 2}, {'id': 4, 'n': 0}, {'id': 5, 'n': 1}, {'id': 5, 'n': 0}]>
этоблизко к реальному ответу, но все же нужно сделать больше.например у меня есть два id = 2.он должен быть один, а n, связанный с ним, должен быть 1 (сумма этих двух n для id = 2)
истинные результаты:
<QuerySet [{'id': 1, 'n': 0}, {'id': 2, 'n': 1}, {'id': 3, 'n': 2}, {'id': 4, 'n': 0}, {'id': 5, 'n': 1}]>