当序列化类MATE中定义了depth时,这个序列化类中引用字段(外键)则自动变为只读,所以进行更新或者创建操作的时候不能使用此序列化类
具体方法是这样的分别定义两个序列化类,判断request的方法并选择,直接上代码:
serializers.py
# ==== 一旦有了depth,引用的字段就变为只读了 ====
class GetSetSerializer(serializers.ModelSerializer):
class Meta:
model = Set
fields = '__all__'
depth = 1
# ==== 这个序列化类没有depth ====
class UpdateSetSerializer(serializers.ModelSerializer):
class Meta:
model = Set
fields = '__all__'
views.py
class SetViewSet(viewsets.ModelViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
queryset = Set.objects.all()
filter_backends = (DjangoFilterBackend, OrderingFilter)
filter_fields = ('production__name',
'available_zone__name',
'trash')
# 此处区分请求的HTTP1.1方法
def get_serializer_class(self):
serializer_class = self.serializer_class
if self.request.method in ('PUT', 'PATCH'):
serializer_class = UpdateSetSerializer
if self.request.method == 'GET':
serializer_class = GetSetSerializer
return serializer_class
完美解决
思考:当然这个也可以通过重载