我正在嘗試使序列化程式類動態化,但它不起作用。我有一個默認的序列化器類,作為不同操作的動態序列化器類。這是我的模型視圖集。
我的看法:
class ClassView(viewsets.ModelViewSet):
queryset = Class.objects.all()
serializer_class = ClassSerializer
serializer_action_classes = {
'put': AddStudentstoClassSerializer,
}
def get_serializer_class(self):
"""
returns a serializer class based on the http method
"""
try:
return self.serializer_action_classes[self.action]
except (KeyError, AttributeError):
print("iam ClassSerializer")
return super(ClassView, self).get_serializer_class()
我在上面同一個模型視圖集中的函式
@action(detail=True, methods=['put'])
def add_remove_students(self, request, *args, **kwargs):
................
我的網址如下:
urlpatterns = [
path("class/<int:pk>/<slug:slug>/",views.ClassView.as_view({"put": "add_remove_students"}),
),
]
在上面的代碼片段中,我嘗試在 add_remove_students 函式中獲取 AddStudentstoClassSerializer 但它不起作用。正如我們所看到的 print("iam ClassSerializer") 代碼正在作業,但是我想要的還是 AddStudentstoClassSerializer。
uj5u.com熱心網友回復:
首先你的serializer_action_classes字典應該是這樣的:
serializer_action_classes = {
'add_remove_students': AddStudentstoClassSerializer,
}
因為self.action回傳操作的名稱,而不是方法名稱。您要使用的是在這種情況下self.request.method應該回傳的屬性PUT..
但是有更好的方法來實作你的目標:
@action(detail=True, methods=['put'], serializer_class=AddStudentstoClassSerializer)
def add_remove_students(self, request, *args, **kwargs):
action 裝飾器可以自己覆寫使用過的 serializer_class。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337554.html
