serializer_action_class 在 DRF 的模型视图集中不工作
serializer_action_class not working in modelviewset in DRF
我正在尝试使序列化程序 class 动态化,但它不起作用。我有一个默认的序列化器 class,作为动态序列化器 class 用于不同的操作。这是我的模型视图集。
我的看法:
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):
................
我的url如下:
urlpatterns = [
path("class/<int:pk>/<slug:slug>/",views.ClassView.as_view({"put": "add_remove_students"}),
),
]
在上面的代码片段中,我尝试在 add_remove_students 函数中获取 AddStudentstoClassSerializer,但它不起作用。我们可以看到 print("iam ClassSerializer") 代码正在运行,但是我想要什么或 AddStudentstoClassSerializer.
首先,您的 serializer_action_classes
字典应该如下所示:
serializer_action_classes = {
'add_remove_students': AddStudentstoClassSerializer,
}
因为self.action
return 动作名称,而不是方法名称。你的意思是使用 self.request.method
属性,在这种情况下应该 return PUT
..
但还有更好的方法来实现您的目标:
@action(detail=True, methods=['put'], serializer_class=AddStudentstoClassSerializer)
def add_remove_students(self, request, *args, **kwargs):
action
装饰器可以自己使用 serializer_class。
我正在尝试使序列化程序 class 动态化,但它不起作用。我有一个默认的序列化器 class,作为动态序列化器 class 用于不同的操作。这是我的模型视图集。
我的看法:
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):
................
我的url如下:
urlpatterns = [
path("class/<int:pk>/<slug:slug>/",views.ClassView.as_view({"put": "add_remove_students"}),
),
]
在上面的代码片段中,我尝试在 add_remove_students 函数中获取 AddStudentstoClassSerializer,但它不起作用。我们可以看到 print("iam ClassSerializer") 代码正在运行,但是我想要什么或 AddStudentstoClassSerializer.
首先,您的 serializer_action_classes
字典应该如下所示:
serializer_action_classes = {
'add_remove_students': AddStudentstoClassSerializer,
}
因为self.action
return 动作名称,而不是方法名称。你的意思是使用 self.request.method
属性,在这种情况下应该 return PUT
..
但还有更好的方法来实现您的目标:
@action(detail=True, methods=['put'], serializer_class=AddStudentstoClassSerializer)
def add_remove_students(self, request, *args, **kwargs):
action
装饰器可以自己使用 serializer_class。