2016-04-18 4 views
1

Ich befolge das Tutorial auf Django Rest Framework - Tutorial 3 Class based views.Wie fügt man ein URL-Feld zu einem Serialisierer mit Django Rest Framework

Wie fügt man einem Serializer ein URL-Feld hinzu (das auf das aktuelle Snippet zeigt)?

serializers.py

from rest_framework import serializers 
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES 
from django.core.urlresolvers import reverse 

class SnippetSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Snippet 
     fields = ('id', 'title', 'code', 'linenos', 'language', 'style') 

urls.py

urlpatterns = [ 
    url(r'^snippets/$', views.SnippetList.as_view()), 
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()), 
] 

Actual Ausgang

[ 
    { 
     "id":1, 
     "title":"", 
     "code":"foo = \"bar\"\n", 
     "linenos":false, 
     "language":"python", 
     "style":"friendly" 
    } 
] 

Wunsch Ausgang

[ 
     { 
      "id":1, 
      "url":"http://192.168.28.131:8000/snippets/1/", 
      "title":"", 
      "code":"foo = \"bar\"\n", 
      "linenos":false, 
      "language":"python", 
      "style":"friendly" 
     }, 

    ] 
+0

Solange Sie die Namenskonvention oder mit dem Namen Urls folgen: http://www.django-rest-framework.org/api-guide/reverse/ – cdvv7788

Antwort

4

Sie haben HyperlinkedModelSerializer Serializer und HyperlinkedIdentityField Feld an die ModelSerializer Klasse außer

Von Django Rest Framework documentation

Die HyperlinkedModelSerializer Klasse ist ähnlich zu verwenden, die es verwendet Hyperlinks zu repräsentieren Beziehungen, anstatt Primärschlüssel. Das URL-Feld wird dargestellt mit einem HyperlinkedIdentityField Serializer-Feld und alle Beziehungen auf dem Modell wird mit einem HyperlinkedRelatedField Serializer-Feld dargestellt werden.

Z. B (mit dem Fall):

class SnippetSerializer(serializers.HyperlinkedModelSerializer): 
     url = serializers.HyperlinkedIdentityField(view_name='snippet-detail', read_only=True) 

    class Meta: 
     model = Snippet 
     fields = ('id', 'url', 'title', 'code', 'linenos', 'language', 'style') 

Natürlich muss view_name Wert den Namen eines verwendeten deklarierten URL entspricht in urls.py (oder anderweitig nicht genannt) alle Informationen über ein Snippet zu erhalten.

Z. B:

# urls.py 
urlpatterns = [ 
    url(r'^snippets/(?P<pk>[0-9]+)$', views.SnippetDetail.as_view(), name='snippet-detail'), 
] 
+0

Dank! Mein 'urls.py' sieht etwas anders aus. Es verwendet 'ansichten.SnippetDetail.as_view()' (Kopieren eingefügt aus Tutorial). Wenn ich deine Definition verwende, bekomme ich '__init __() genau ein Argument (3 gegeben)' irgendwelche Gedanken? –

+1

Ja, füge einfach einen 'name' Wert hinzu. Ich habe mein Beispiel aktualisiert. Es funktioniert nicht, weil Sie die klassenbasierte Ansicht verwenden. Benutze dies: 'url (r '^ schnipsel/(? P [0-9] +) $', ansichten.SnippetDetail.as_view(), name = 'snippet-detail')' –

Verwandte Themen