Django REST - скрытие десериализованных данных

Я хочу хранить некоторые данные в одном из полей моей базы данных. Данные добавляются в это поле при десериализации методом POST. Позже, когда я хочу показать данные методом GET, я не хочу, чтобы это поле было представлено.

Когда я делаю POST, я десериализую эту строку:

{
    "car_id": 3,
    "rating": 3
}

Позднее в views.py я выполняю десериализацию во время POST:

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

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

        if rate_serializer.is_valid():
            try:
                car_obj = Car.objects.get(pk=rate_data['car_id'])
            except Car.DoesNotExist:
                return JsonResponse({'message': 'The car with given ID does not exist!'}, status=status.HTTP_404_NOT_FOUND)
        
            # check if rate is from 1 to 5
            r = rate_serializer.validated_data['rating']
            if int(r) >= 1 and int(r) <= 5:
                rate_serializer.save()
                return JsonResponse({'message':'The rate is in the scope!'})
            else:
                return JsonResponse({'message':'The rate is NOT in the scope!'})
        
        return JsonResponse(rate_serializer.errors)

А вот и мой models.py:

class Car(models.Model):
    make = models.CharField(max_length=15)
    model = models.CharField(max_length=15)
    avg_rating = models.FloatField(default=0)

    def __str__(self):      # print it when Car instance is needed
        return self.make


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

Код действительно работает (каким-то образом). Пока что можно добавлять тарифы для одного автомобиля (несколько тарифов) с помощью POST-методов. Я храню тарифы в классе CarRate и позже он будет использоваться для расчета среднего тарифа для автомобиля. Я просто не хочу выводить его с помощью GET.

Я прочитал о методе defer() и попробовал его, но ничего не произошло. Есть помощь?

Просто удалите поле rating из, CarRateSerializer ИЛИ вы можете создать новый сериализатор для CarRate.

Если вы абсолютно не хотите, чтобы это поле когда-либо было в вашей базе данных, то вы можете просто удалить это поле из опции поля сериализатора (вы назвали его CarRateSerializer). Но если вы хотите, чтобы это поле было в вашей базе данных, но не хотите, чтобы оно отображалось в выводе, вы можете использовать extra_kwargs с 'write_only': True в вашем классе сериализатора. Привожу пример, который я использовал для одного из своих проектов

class TopicSerializer(serializers.ModelSerializer):

class Meta:
    model = Topic
    fields = ['id','title', 'totalMarks', 'status', 'categoryID']
    extra_kwargs = {'categoryID': {'write_only': True}}

для вашего кода, вы можете добавить эту строку кода ниже fields в том классе Meta вашего CarRateSerializer

extra_kwargs = {'rating': {'write_only': True}}

Надеюсь, это решит вашу проблему

Вернуться на верх