Django REST ocultar deserializar datos

0

Pregunta

Me gustaría almacenar algunos datos en uno de mi campo de base de datos. Los datos se agregan a ese campo, mientras que la deserialización con el método POST. Más tarde, cuando quiero mostrar los datos con el método GET no quiero que un campo para ser presentado.

Cuando hago POST me deserializar que la cadena:

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

Más tarde en views.py Hago la deserialización 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)

Y no es mi 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)

El código no funciona (de alguna manera). Por ahora no puede ser añadido tasas para un coche (de varios tipos) con el POST moethods. Puedo almacenar las tasas CarRate en la clase y más tarde será utilizado para calcular la tasa promedio para un coche. Yo simplemente no querer imprimir con GET.

Esta es mi salida ahora mismo:

{
    "id": 2,
    "make": "Volkswagen",
    "model": "Golf",
    "rates": [
        4,
        4,
        2,
        3
    ],
    "avg_rating": 0.0
},

Simplemente quiero que el rates campo para ser invisible durante la impresión.

He leído acerca de defer() método y lo probé, pero no pasó nada. Alguna ayuda?

django django-rest-framework python
2021-11-24 00:09:06
2

Mejor respuesta

1

Si usted absolutamente no quieren que el campo en tu base de datos, entonces usted puede simplemente eliminar ese campo de la Serializador campo de opción (el nombre que CarRateSerializer) Pero si quieres que sea en su base de datos, pero no quiere que mostrar como resultado, puede utilizar extra_kwargs con 'write_only': True en su serializador de clase. Yo voy a dar un ejemplo que he usado para uno de mis proyectos

class TopicSerializer(serializers.ModelSerializer):

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

para su código, usted puede añadir esta línea de código a continuación de los campos en que clase de Meta de su CarRateSerializer

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

Espero que esto debería resolver el problema

2021-11-24 10:26:59

Hell yeah! write_only hace exactamente lo que yo quiero, excepto que yo no quiero ocultar rating pero rates. La cosa con extra_kwargs no trabajo en CarSerializer, pero creo que es porque de read_only establece en True en las tasas de variable. He cambiado que a write_only y lo hace de la misma lo que usted escribió. Lección aprendida, gracias!
wolnio
0

Acaba de quitar rating campo de, CarRateSerializer O puede crear un nuevo Serializador para CarRate.

2021-11-24 04:31:35

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................