9

vorrei aggiungere uno spazio dei nomi URL al mio router api, ma quando faccio il router sembra ancora per gli URL senza un namespace:Come aggiungere spazio dei nomi URL di un router django-resto-quadro 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')), 
         ) 

L'API navigabile cerca nomi di url come 'user-list' e 'user-detail' ancora invece di che è quello che mi piacerebbe che accadesse.

Suppongo che ci sia una soluzione semplice per questo (sembra una cosa piuttosto standard da voler fare) ma non riesco a trovare alcuna soluzione nei documenti django-rest-framework. Se mi manca qualcosa dai documenti, si prega di condividere un link o se mi sto avvicinando a questo sbagliato (cioè "perché dovresti farlo, è una cattiva pratica" o qualsiasi altra cosa) per favore spiega perché o quale sarebbe il modo corretto di gestire gli URL di api essere. Grazie!

risposta

4

C'è un pull request open for this currently. Sentiti libero di unirti alla discussione.

+0

Impressionante! Il tiro di @ readevalprint funziona in gran parte? Voglio contribuire ma non voglio inquinare la discussione con la mia ignoranza dell'intera situazione. Riesci a riassumere brevemente lo stato e i principali problemi di non accettare ancora il pull? –

+0

Il motivo principale è l'attuale mancanza di test - aggiunge un nuovo comportamento e dobbiamo coprirlo (e fare il bootstrap del test è un po 'un problema quindi abbiamo bisogno di una derisione decente.) - La mia ipotesi sarebbe nelle solite circostanze che avrebbe funzionato ™ - se non funziona per te è utile saperlo. Non preoccuparti di inquinare la discussione: Partecipa. :-) –

+2

puoi indicare la soluzione finale qui? –

0

Questa è una domanda molto vecchia e la risposta attualmente accettata da Carlton Gibson è solo un collegamento a una richiesta di pull su GitHub.

Durante la ricerca sul Web per l'utilizzo di router Django REST Framework con spazio dei nomi, viene prima nei risultati. Sembra essere l'unica domanda su SO di questo argomento.
Poiché non c'è una risposta concreta con l'esempio di codice, qui vorrei aggiungere la mia soluzione.

Prendiamo il EventViewSet dalla risposta dell'OP. Per questo viewet dovrebbe esserci una classe modello Event e un serializzatore modello EventSerializer.
Il EventSerializer potrebbe assomigliare a questo:

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

Questo è un esempio per HyperlinkedModelSerializer che comprende url campo.

Tutti i campi collegamento ipertestuale come HyperlinkedIdentityField o HyperlinkedRelatedField, che prendono view_name come argomento dovrebbe essere passato il nome della vista corretto che contiene lo spazio dei nomi, sia nella dichiarazione o attraverso il extra_kwargs.
Per un CommentSerializer assunto (corrispondente al CommentViewSet) potrebbe apparire come:

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