我有一个电视频道模型并创建了一个django-restframework viewlet,它为我提供了一个开箱即用的列表和详细视图。在顶部,我添加了两个名为all_events和now_and_next_event的自定义单对象视图,如下所述:Marking extra methods for routing。到目前为止效果很好。
class ChannelViewSet(viewsets.ModelViewSet):
"""
A viewset for viewing and editing channel instances.
"""
serializer_class = serializers.ChannelSerializer
queryset = Channel.objects.all()
@link()
def now_and_next_event(self, request, pk):
''' Show current and next event of single channel. '''
...
现在我想添加一个自定义视图,它不是单个对象视图,而是类似列表的视图:
class CurrentEvents(generics.ListCreateAPIView):
''' Show current event of all channels. '''
model = Event
serializer_class = serializers.EventSerializer
def get(self, request):
...
当我禁用我的Viewlet并为其添加手动url模式时,它也可以正常工作。但我还没弄明白如何使用相同的'api / channel /'前缀,或者我想要的更多,如何将自定义列表视图类添加到我的viewlet中。
以下是我的Viewlet网址模式:
^api/channel/$ [name='channel-list']
^api/channel/(?P<pk>[^/]+)/$ [name='channel-detail']
^api/channel/(?P<pk>[^/]+)/all_events/$ [name='channel-all-events']
^api/channel/(?P<pk>[^/]+)/now_and_next_event/$ [name='channel-now-and-next-event']
我想访问我的列表视图,如:
^api/channel/current_events/$ [name='event-current']
答案 0 :(得分:5)
从Django REST Framework 2.4开始,您现在可以使用ViewSet
修饰@list_route
方法,以获得您想要的内容。
@detail_route
装饰器在其URL模式中包含pk
,适用于需要单个实例的方法。@list_route
装饰器适用于对象列表进行操作的方法。
这些替换旧的@link
和@action
装饰器,它们只能用作详细路线。
答案 1 :(得分:1)
如果你想要对象列表,那么你需要ListApiView中的list方法: 例如,model是ModelName,serializer类是SerializerClassname 然后代码将是:
class ExampleView(ListAPIView):
model = ModelNmae
serializer_class = SerializerClassName
permission_classes = (IsAuthenticated,)
def get_queryset(self):
"""
"""
queryset = ModelName.objects.all()
q = self.request.query_params.get('q', None)
if q is not None:
queryset =queryset.filter(name__icontains=q)
return queryset
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
result = [ x.values()[0] for x in serializer.data ]
return Response(result)