найти водителей и количество поездок с некоторыми условиями - PullRequest
0 голосов
/ 11 июля 2019

Я должен написать код, чтобы найти всех водителей (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}]>
...