Перенос логики из представлений Django в модели

Это моя модель:

class Car(models.Model):
    make = models.CharField(max_length=30)
    model = models.CharField(max_length=30)
    rating = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)], default=0, blank=True)
    avg_rating = models.FloatField(default=0, blank=True)
    rates_number = models.IntegerField(default=0, blank=True)

    def __str__(self):
        return self.make + ' ' + self.model

Каким образом лучше всего перенести логику из следующей функции perform_create (в views.py) в мои модели?

class CarRate(generics.CreateAPIView):
    serializer_class = CarRatingSerializer
    queryset = Car.objects.all()
 
    def perform_create(self, serializer):
        pk = serializer.validated_data['car_id']
        rating = serializer.validated_data['rating']
        queryset = Car.objects.all()
        car_queryset = get_object_or_404(queryset, pk=pk)
  
        if car_queryset.rates_number == 0:
            car_queryset.avg_rating = rating
        else:
            car_queryset.avg_rating = (car_queryset.avg_rating + rating)/2
            car_queryset.avg_rating = round(car_queryset.avg_rating, 1)

        car_queryset.rates_number = car_queryset.rates_number + 1
        car_queryset.save()

Гораздо лучше было бы создать две модели. Подумайте о том, как вы считаете средний рейтинг. Это была бы лучшая идея на данный момент:

class Car(models.Model):
    make = models.CharField(max_length=30)
    model = models.CharField(max_length=30)

    def rates_number(self):
        return self.rates.all().count()

    def avg_rating(self):
        # count average_rating from relation to Rate objects and return it
        return average_rating

class CarRate(models.Model):
    value = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)], default=0, blank=True)
    car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name='rates')
Вернуться на верх