9

Ich möchte eine URL-Namespace zu meinem api Router hinzufügen, aber hinzufügen, wenn ich den Router tun sieht immer noch für Urls ohne Namensraum:Wie Namespace-URL zu einer django-Rest-Rahmen-Router Viewset

router = DefaultRouter() 
router.register(r'users', UserViewSet) 
router.register(r'events', EventViewSet) 
router.register(r'comments', CommentViewSet) 

urlpatterns = patterns('apiroot.views', 
         url(r'^', include(router.urls, namespace='api')), 
         ) 

Das durchsuchbare API sucht nach URL-Namen wie 'user-list' und 'user-detail' immer noch anstelle von 'api:user-list', was ich gerne geschehen würde.

Ich gehe davon gibt es eine einfache Lösung für diesen (es wie eine ziemlich Standard-Sache scheint wollen), aber ich kann keine Lösung in dem django-Rest-Rahmen docs finden. Wenn ich etwas aus den Dokumenten verpasse, bitte teilen Sie einen Link oder wenn ich mich dem Unrecht annähere (zB "Warum würdest du das tun, es ist eine schlechte Übung" oder was auch immer), bitte erkläre warum oder was der korrekte Weg zur Verwaltung von APIs wäre Sein. Vielen Dank!

Antwort

4

Es gibt eine pull request open for this currently. Bitte zögern Sie nicht, an der Diskussion teilzunehmen.

+0

Awesome! Funktioniert @redevalprint am meisten? Ich möchte etwas beitragen, aber ich möchte die Diskussion nicht mit meiner Unkenntnis der ganzen Situation belasten. Kannst du kurz den Status und die Hauptprobleme, die noch nicht akzeptiert wurden, zusammenfassen? –

+0

Der Hauptgrund ist das derzeitige Fehlen von Tests - es fügt ein neues Verhalten hinzu und wir müssen es abdecken (und das Bootstrapping ist ein wenig mühsam, also brauchen wir anständiges Spott.) - Meine Vermutung wäre unter normalen Umständen, es würde einfach funktionieren ™ - wenn es für Sie nicht funktioniert, ist es nützlich, es auch zu wissen. Mach dir keine Sorgen über die Verschmutzung der Diskussion: Mach mit. :-) –

+2

Kannst du die endgültige Lösung hier zeigen? –

0

Dies ist eine sehr alte Frage und die derzeit akzeptierte Antwort von Carlton Gibson ist nur ein Link zu einer Pull-Anfrage auf GitHub.

Bei der Suche im Web nach Django REST Framework-Routern mit Namespace kommt es an erster Stelle in den Ergebnissen. Es scheint die einzige Frage in SO zu diesem Thema zu sein.
Da es keine konkrete Antwort mit Codebeispiel gibt, möchte ich hier meine Lösung hinzufügen.

Nehmen wir die EventViewSet aus der OP-Antwort. Für diesen Viewset sollte eine Modellklasse Event und ein Modell-Serializer EventSerializer vorhanden sein.
Die EventSerializer könnte wie folgt aussehen:

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    # any other fields 
    class Meta: 
     model = Event 
     # anything else 
     extra_kwargs = { 
      'url': {'view_name': 'api:event-detail'} 
     } 

, das ein Beispiel für HyperlinkedModelSerializer ist die url Feld enthält.

Alle verlinkte Felder wie HyperlinkedIdentityField oder HyperlinkedRelatedField, die view_name nehmen als Argument sollte den Namen des Namespace, entweder in der Anmeldung oder durch die extra_kwargs enthält korrekte Sicht übergeben werden.
Bei einem angenommenen CommentSerializer (entsprechend dem CommentViewSet) es aussehen könnte:

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    comments = serializers.HyperlinkedRelatedField(
     many=True, 
     read_only=True, 
     view_name='api:event-detail' 
    )