路由器工作with a ViewSet http://www.django-rest-framework.org/api-guide/viewsets/并且不是为普通视图设计的,但这并不意味着您不能将它们与普通视图一起使用。通常它们与模型一起使用(以及ModelViewSet
),但它们可以在没有它们的情况下使用GenericViewSet
(如果您通常使用GenericAPIView
) and 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
and get
-> list
。我还更新了名称以表明它不仅仅是一个普通视图(作为ViewSet
不能以相同的方式初始化),但这不是必需的。
因此,使用这个新视图,您可以像其他任何视图一样在路由器中注册它。你需要一个base_name
在这里可以生成 url 名称(通常这将从查询集中提取)。
router.register(r'updatetime', views.UpdateTimeViewSet, base_name='updatetime')
所以现在updatetime
端点将在 API 根中可用,您只需调用端点(简单的 GET 请求)即可获取最新时间。