ModelViewSet - 更新嵌套字段
Posted
技术标签:
【中文标题】ModelViewSet - 更新嵌套字段【英文标题】:ModelViewSet - Update nested field 【发布时间】:2015-03-05 16:15:58 【问题描述】:我目前正在使用 Django Rest 框架开发 Django。
我无法在嵌套对象字段中更新我的对象。
serializer.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')
view.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)
当我这样做时:
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 上保留所有者序列化; 我们可以想象汽车被另一个对象嵌套等等......如果我想在更新汽车时更改所有者,我该怎么办。
【问题讨论】:
django-rest-framework 3.0 create or update in nested serializer的可能重复 坦克!我重复一遍对不起,但为什么覆盖在序列化程序中而不是在视图中,比如:Django-doc,这样可以返回状态?? 如果你想通过 id 改变 anser 覆盖 to_representation 方法***.com/questions/41394761/… 我在 post 方法中收到此错误并放置。 【参考方案1】:有点晚了,但是,试试这个,
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
【讨论】:
它不工作,同样的错误在这里,不能从汽车编辑所有者。【参考方案2】:以防万一有人偶然发现这个
在我的情况下有同样的错误,但将 read_only 设置为 True 为我修复了它。
owner = ownerSerializer(many=False, read_only=True)
请注意,该字段在向 api 发布数据时不会出现在表单中。
【讨论】:
问题是how to change the owner when I update the car?
。
@Alex78191 正是我现在卡在哪里!我需要这个字段作为 PATCH 请求的一部分,所以我当然应该能够更改它,但在我的用例中,我还需要能够在后端将其设为 null。谢谢,DRF? ?以上是关于ModelViewSet - 更新嵌套字段的主要内容,如果未能解决你的问题,请参考以下文章
用 ModelViewSet 的多个查找字段替换 Default PK slug
Django Rest Framework - 使用 ModelSerializer 和 ModelViewSet 更新相关模型