Ответ 1
Маршрутизаторы работают с ViewSet
и не предназначены для обычных представлений, но это не означает, что вы не можете использовать их с обычным представлением. Обычно они используются с моделями (и a 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 могли быть сгенерированы (обычно это вытаскивало из запроса).
router.register(r'updatetime', views.UpdateTimeViewSet, base_name='updatetime')
Итак, конечная точка updatetime
будет доступна в корне API, и вы сможете получить последние времена, просто вызвав конечную точку (простой запрос GET).