DRF depth=1的情況下物件的建立與更新問題
阿新 • • 發佈:2019-02-05
當序列化類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
完美解決
思考:當然這個也可以通過過載