Ошибка валидации в запросе Django 'POST'

Я новичок в Django Rest Framework

Я создал модель и сериализатор для нее. Вот оно:

models.py

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

    def __str__(self):
        return self.make


class CarRate(models.Model):
    rate = models.ForeignKey(Car, related_name='rates', on_delete=models.CASCADE)

serializers.py

class CarRateSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = CarRate
        fields = ('rate')

class CarSerializer(serializers.HyperlinkedModelSerializer):
    rates = CarRateSerializer(many=True)
    '''rates = serializers.PrimaryKeyRelatedField(
        many=True,
        read_only=False,
        queryset=CarRate.objects.all()
    )'''

    def create(self, validated_data):
        rates_data = validated_data.pop("rates")
        car = Car.objects.create(**validated_data)
        for rate_data in rates_data:
            CarRate.objects.create(car=car, **rate_data)
        return car

    class Meta:
        model = Car
        fields = ('id', 'make', 'model', 'rates')

Я хочу добавить тариф для автомобиля с определенным ID с помощью метода POST и JSON, но когда я делаю это несколько раз, он сохраняет все тарифы для этого одного объекта. Я добавлю тариф следующим образом:

{
    "id":2,
    "rate":4
}

Вот мой метод POST, но он дает ответ Car id not found, поэтому он не проходит валидацию.

views.py

@api_view(['POST'])
def car_rate(request):

    if request.method == 'POST':
        rate_data = JSONParser().parse(request)
        rate_serializer = CarSerializer(data=rate_data)

        if rate_serializer.is_valid():
        
            ''' Code that checks if a rate is from 1 to 5 '''

        return JsonResponse({'message': 'Car id not found!'})

Так что я думаю, что может быть проблема в том, что CarSerializer требует больше полей, чем одно поле rate и я должен как-то передать только тариф этой машине, но не знаю как.

В вашей модели тарифов автомобилей на самом деле нет поля для хранения 'rate', текущее поле rate хранит данные об автомобиле, а не о тарифах. Поэтому измените модель CarRate на

class CarRate(models.Model):
    car = models.ForeignKey(Car, related_name='rates', on_delete=models.CASCADE)
    rate = models.PositiveIntegerField(default=0)

Serializer

class CarRateSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = CarRate
        fields = ('__all__')

просмотр автомобильного рейтинга

@api_view(['POST'])
def car_rate(request):

    if request.method == 'POST':
        rate_data = JSONParser().parse(request)
        rate_serializer = CarRateSerializer(data=rate_data) #Changed Serializer class

        if rate_serializer.is_valid():
        
            ''' Code that checks if a rate is from 1 to 5 '''
            return JsonResponse({'message': 'valid'})

        return JsonResponse({'message': 'Car id not found!'})
Вернуться на верх