blu*_*inc 2 python api django django-rest-framework
我有一个视图集如下:
class CardViewSet(viewsets.ReadOnlyModelViewSet):
"""
Standard Viewset for listing cards
"""
pagination_class = StandardCellSetPagination
permission_classes = [AllowAny, IsAuthenticated]
def list(self, request):
queryset = Card.objects.exclude(reply_to__isnull=False).order_by('-created')
cards = self.paginate_queryset(queryset)
serializer = CardCellSerializer(cards, many=True)
return self.get_paginated_response(serializer.data)
def retrieve(self, request, pk=None):
queryset = Card.objects.all()
card = get_object_or_404(queryset, pk=pk)
serializer = CardSerializer(card)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
我的CardSerializer序列化器是:
class CardSerializer(serializers.ModelSerializer):
class Meta:
model = Card
Run Code Online (Sandbox Code Playgroud)
我该怎么做
IsAuthenticated
?要么CardSerializer
if视图集中添加一个字段IsAuthenticated
?True / False
如果用户通过a收藏了卡,我可以返回SerializerMethodField
你可以这样做:
def retrieve(self, request, pk=None):
queryset = Card.objects.all()
card = get_object_or_404(queryset, pk=pk)
# Same for list method
if request.user and request.user.is_authenticated:
serializer = AuthenticatedCardSerializer(card)
else:
serializer = CardSerializer(card)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
AuthenticatedCardSerializer
然后可以扩展CardSerializer
以包括经过身份验证的用户可见的任何字段.
此外,如果你决定使用相同的序列化行为list
和retrieve
,你可以覆盖get_serializer_class
在你的视图集中,而不是:
def get_serializer_class(self):
if self.request.user and self.request.user.is_authenticated:
return AuthenticatedCardSerializer
else:
return CardSerializer
Run Code Online (Sandbox Code Playgroud)
并将其他所有内容保留为默认list
/ retrieve
实现.
作为替代方案,您可以在序列化程序中添加该字段__init__
.您可以从context
kwarg 获取请求,执行相同的检查并添加您需要的任何字段.我认为它不仅仅比拥有两个序列化器更复杂.