如何在路由器上注册一个视图(不是视图集)?

如何在路由器上注册一个视图(不是视图集)?,第1张

如何在路由器上注册一个视图(不是视图集)?

路由器与a配合使用

ViewSet
,并且不是为普通视图设计的,但这并不意味着您不能在普通视图中使用它们。通常,它们与模型(和
ModelViewSet
)一起使用,但是在没有它们的情况下,可以使用
GenericViewSet
(如果通常使用
GenericAPIView
)和
ViewSet
(如果仅使用
APIView
)使用它们。

对于列表视图,请求方法映射到这样的

ViewSet
方法

  • GET
    ->
    list(self, request, format=None)
  • POST
    ->
    create(self, request, format=None)

对于详细视图(URL中带有主键),请求方法使用以下映射

  • GET
    ->
    retrieve(self, request, pk, format=None)
  • PUT
    ->
    update(self, request, pk, format=None)
  • PATCH
    ->
    partial_update(self, request, pk, format=None)
  • DELETE
    ->
    destroy(self, request, pk, format=None)

因此,如果您想对路由器上的视图使用这些请求方法中的任何一种,则需要覆盖正确的视图方法(因此,

list()
而不是
get()
)。


现在,特别是在你的情况你会正常使用的

APIView
,看上去像

class UpdateTimeView(APIView):    def get(self, request, format=None):        latest_publish = Publish.objects.latest('created_time')        latest_meeting = Meeting.objects.latest('created_time')        latest_training = Training.objects.latest('created_time')        latest_exhibiting = Exhibiting.objects.latest('created_time')        return Response({ "publish_updatetime": latest_publish.created_time, "meeting_updatetime": latest_meeting.created_time, "training_updatetime": latest_training.created_time, "exhibiting_updatetime": latest_exhibiting.created_time,        })

可比的

ViewSet

class UpdateTimeViewSet(ViewSet):    def list(self, request, format=None):        latest_publish = Publish.objects.latest('created_time')        latest_meeting = Meeting.objects.latest('created_time')        latest_training = Training.objects.latest('created_time')        latest_exhibiting = Exhibiting.objects.latest('created_time')        return Response({ "publish_updatetime": latest_publish.created_time, "meeting_updatetime": latest_meeting.created_time, "training_updatetime": latest_training.created_time, "exhibiting_updatetime": latest_exhibiting.created_time,        })

注意两个必需的更改:

APIView
->
ViewSet
get
->
list
。我还更新了名称,以表明它不仅仅是普通视图(因为
ViewSet
不能以相同的方式初始化),但这不是必需的。

因此,使用此新视图,您可以像其他任何方法一样在路由器中注册它。您需要在

base_name
此处创建一个url名称(通常会从queryset中提取)。

router.register(r'updatetime', views.UpdateTimeViewSet, base_name='updatetime')

因此,现在

updatetime
可以在API根目录中使用端点了,您只需调用端点即可获得最新时间(一个简单的GET请求)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5623739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存