tutorial framework consumir python django django-rest-framework

python - framework - ModelViewSet-Actualizar campo anidado



django rest framework serializer (2)

Actualmente estoy trabajando en Django con Django Rest Framwork.

No puedo actualizar mi objeto dentro del campo objeto anidado.

serializador.py

class OwnerSerializer(serializers.ModelSerializer): class Meta: model = Owner fields = (''id'', ''name'') class CarSerializer(serializers.ModelSerializer): owner = ownerSerializer(many=False, read_only=False) class Meta: model = Car fields = (''id'', ''name'', ''owner'')

ver.py

class OwnerViewSet(viewsets.ModelViewSet): queryset = Owner.objects.all() serializer_class = OwnerSerializer class CarViewSet(viewsets.ModelViewSet): serializer_class = CarSerializer queryset = Car.objects.all() def create(self, request): serialized = self.serializer_class(data=request.DATA) if serialized.is_valid(): serialized.save() return Response(status=HTTP_202_ACCEPTED) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Cuando hago esto:

Request URL:http://localhost:9000/api/v1/cars/1/?format=json Request Method:PUT Request Paylod : { "id":1, "name": "TEST", "ower": { "id":1, "name": "owner_test" } }

Me sale la siguiente respuesta:

The `.update()` method does not support writable nestedfields by default. Write an explicit `.update()` method for serializer `app.serializers.CarSerializer`, or set `read_only=True` on nested serializer fields.

Sabiendo

  • Quiero mantener la serialización del propietario en GET;
  • Podemos imaginar el coche anidado por otro objeto y ect ...

¿Cómo puedo hacer si quiero cambiar el propietario cuando actualizo el auto?


Solo en caso de que alguien se tropiece con esto

tuve el mismo error en mi caso, pero establecer read_only en True lo solucionó para mí.

owner = ownerSerializer(many=False, read_only=True)

Tenga en cuenta que este campo no aparecerá en el formulario al publicar datos en la api.


Un poco tarde, pero, prueba esto,

class OwnerSerializer(serializers.ModelSerializer): class Meta: model = Owner fields = (''id'', ''name'') extra_kwargs = { ''id'': { ''read_only'': False, ''required'': True } } #very important def create(self, validated_data): # As before. ... def update(self, instance, validated_data): # Update the instance instance.some_field = validated_data[''some_field''] instance.save() # Delete any detail not included in the request owner_ids = [item[''owner_id''] for item in validated_data[''owners'']] for owner in cars.owners.all(): if owner.id not in owner_ids: owner.delete() # Create or update owner for owner in validated_data[''owners'']: ownerObj = Owner.objects.get(pk=item[''id'']) if ownerObje: ownerObj.some_field=item[''some_field''] ....fields... else: ownerObj = Owner.create(car=instance,**owner) ownerObj.save() return instance