【发布时间】:2020-05-21 06:51:44
【问题描述】:
我在我的视图集上使用了一个 mixin,以便可以在不同的 viewset actions 和任何 custom actions 上使用多个序列化程序。
我有一个名为invoice 的额外操作,它只是一个普通更新,但使用了不同的序列化程序。我需要在端点执行 OPTIONS 请求以获取 <select> 元素的选项。问题是当我执行请求时,它会从默认更新中获取序列化程序 - OrderSerializer 而不是 InvoiceSerializer。如何从正确的序列化程序中获取选项?
class MultipleSerializerMixin:
"""
Mixin that allows for multiple serializers based on the view's
`serializer_action_classes` attribute.
ex.
serializer_action_classes = {
'list': ReadOnlyListSerializer,
'retrieve': ReadOnlyDetailSerializer,
}
"""
def get_serializer_class(self):
try:
return self.serializer_action_classes[self.action]
except (KeyError, AttributeError):
return super().get_serializer_class()
class OrderAPIViewSet(MultipleSerializerMixin,
viewsets.ModelViewSet):
queryset = Order.objects.all()
serializer_class = serializers.OrderSerializer
serializer_action_classes = {
'invoice': serializers.InvoiceSerializer,
}
@action(detail=True, methods=['put'], url_name='invoice')
def invoice(self, request, *args, **kwargs):
"""
Invoice the order and order lines.
"""
return self.update(request, *args, **kwargs)
更新:
因此,在检查了determine_actions method in metadata.SimpleMetadata 之后,似乎在执行 OPTIONS 请求时,view.action 是metadata 而不是invoice,这就解释了为什么序列化程序默认为view.serializer_class。
【问题讨论】:
标签: django django-rest-framework