在Django REST API方法的第2版中添加Create

时间:2017-04-19 19:46:59

标签: python django rest django-rest-framework

我有一个在Django rest-framework中构建的API。模型的第一个版本不支持post / create。我现在使用here描述的URL路径方法添加我的API的v2。

这是我的主要URL路由器:

from django.conf.urls import include, url
from rest_framework.authtoken.views import obtain_auth_token
from board.urls import router

urlpatterns = [
    url(r'^api/token/', obtain_auth_token, name='api-token'),
    url(r'^api/', include(router.urls)),
    url(r'^api/(?P<version>(1.0|2.0))/', include(router.urls)),
]

这是我的项目特定的URL路由器:

from rest_framework.routers import DefaultRouter

from . import views

router = DefaultRouter()
router.register(r'sprints', views.SprintViewSet)
router.register(r'tasks', views.TaskViewSet)
router.register(r'users', views.UserViewSet)

以下是我的观点:

class SprintViewSet(DefaultsMixin, viewsets.ReadOnlyModelViewSet):

    def get_serializer_class(self):
        if self.request.version == '2.0':
            return SprintSerializer2
        return SprintSerializer

    queryset = Sprint.objects.order_by('end')

我的问题是:我如何从这个只读视图更改为基于版本的可更新视图?

我已经考虑了两种方法,但我不确定如何做...

一种是路由到不同的视图,但我不确定如何从包含的路由器获取版本。

第二种方法是以某种方式告诉Django根据版本动态支持post / create。

[注意:此代码来自过度简化的教程,但表达了我在更复杂的应用程序中遇到的问题]

1 个答案:

答案 0 :(得分:0)

我认为这里的答案是使用不同的URL路由,而不是检查版本标记。

e.g。

api/sprints/<id>/get api/v2/sprints/<id>/get

在URL级别,您将路由到v1 / v2的其他ViewSet