Python ModelViewSet-更新嵌套字段
我目前正在使用Django Rest Framwork开发Django 我无法更新嵌套对象字段中的对象Python ModelViewSet-更新嵌套字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,我目前正在使用Django Rest Framwork开发Django 我无法更新嵌套对象字段中的对象 序列化程序.py class OwnerSerializer(serializers.ModelSerializer): class Meta: model = Owner fields = ('id', 'name') class CarSerializer(serializers.ModelSerializer): owner = ow
序列化程序.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')
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)
view.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')
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)
当我这样做时:
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"
}
}
我得到以下回应:
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.
知道:
- 我想在GET上保留所有者序列化李>
- 我们可以想象汽车被另一个物体嵌套,等等
当我更新汽车时,如果我想更换车主,我该怎么办。以防有人无意中发现这一点 在我的案例中也有同样的错误,但是将read_only设置为True为我修复了它
owner = ownerSerializer(many=False, read_only=True)
请注意,将数据发布到api时,此字段不会出现在表单中。有点晚,但是,请尝试以下操作:
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
可能是坦克的复制品!很抱歉,我重复一遍,但是为什么覆盖在序列化程序中而不在视图中,例如:,这样可以返回状态??如果您想通过id更改anser是覆盖到\u表示方法,它不起作用,同样的错误在这里,caanot edit owner from car。问题是
当我更新汽车时如何更改所有者?
。