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