Serializer_action_class не работает в modelviewset в DRF
Я пытаюсь сделать класс сериализатора динамическим, но это не работает. У меня есть класс сериализатора по умолчанию, а также динамический класс сериализатора для различных действий. Вот моя модельviewset.
Мое мнение:
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()
Моя функция внутри того же modelviewset выше
@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"}),
),
]
В приведенном выше фрагменте кода я пытаюсь получить AddStudentstoClassSerializer внутри функции add_remove_students, но это не работает. Как мы видим, код print("iam ClassSerializer") работает, однако то, что я хотел, или AddStudentstoClassSerializer.
Прежде всего, ваш словарь 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.