2017-04-19 1 views
0

Ich habe eine eine API in dem Ruhe-Framework Django gebaut. Die erste Version eines Modells unterstützte post/create nicht. Ich füge jetzt v2 meiner API mit der beschriebenen URL-Pfad-Methode here hinzu.hinzufügen in Version 2 Erstellen von Django REST API Methode

Hier ist meine Haupt-URL-Router:

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)), 
] 

Hier mein projektspezifische URL-Router ist:

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) 

Hier ist meine Ansicht:

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') 

Meine Frage ist: Wie kann ich basierend auf der Version von dieser schreibgeschützten Ansicht zu einer aktualisierbaren Ansicht wechseln?

Ich habe über zwei Ansätze gedacht, aber ich bin nicht sicher, wie entweder zu tun ...

One Route zu einer anderen Ansicht sein würde, aber ich bin mir nicht sicher, wie die Version zu bekommen aus der enthaltene Router.

Die zweite wäre irgendwie Django zu sagen, die dynamisch unterstützt post/erstellen, basiert auf der Version.

[Anmerkung: Dieser Code wird von einem über vereinfachten Tutorial genommen, aber drückt das Problem, das ich in eine anspruchsvollere Anwendung haben]

Antwort

0

Ich denke, die Antwort ist hier verschiedene URL Routen haben, anstatt für zu prüfen ein Versions-Flag

z.B.

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

wo auf URL-Ebene Sie Route zu einem anderen Viewset für v1/v2

+0

Wenn ich diesen Weg zu gehen war, was den richtigen Weg ist, das zu handhaben, da die Versionsnummer ist am Anfang der URL, wo der erste Router sucht, aber ich möchte den Schalter in den spezifischeren, enthaltenen Router machen? –

+0

also schlug ich vor, diese Methode http://www.django-rest-framework.org/api-guide/versioning/#urlpathversioning zu machen, anstatt zu versuchen, Namensraumumwandlungen zu machen –

Verwandte Themen