2014-11-13 4 views
10

Ich erstelle eine REST-Web-API mit dem Django REST Framework. Die Dinge laufen gut, aber ich bin auf ein Problem mit verschachtelten Ressourcen gestoßen. Zunächst wurden alle Beziehungen in der REST-API durch Hyperlinks verknüpft. Ein Post, zum Beispiel, sah wie folgt aus:Django REST Framework: wann eine verlinkte Ressource und wann eine verschachtelte Ressource erstellen? Wie verschicken Sie eine verschachtelte Ressource?

{ 
    "path": "http://api.myproject.com/posts/1.json", 
    "id": 1, 
    "author": "http://api.myproject.com/users/broak.json", 
    "image": "/images/posts/cxyUzlPo.jpg", 
    "header": "Who am I?", 
    "footer": "I am a champion!", 
    "date": "2014-11-09 15:16", 
    "likes": "http://api.myproject.com/posts/1/likes.json", 
    "comments": "http://api.myproject.com/posts/1/comments.json", 
    "likes_count": 0, 
    "comments_count": 0 
} 

Die Beziehung zwischen dem Pfosten und dem Autor (Benutzer) mittels Hyperlink verwiesen wird. Wenn Sie einen neuen Beitrag erstellen möchten, müssen Sie einen korrekten Hyperlink zu einem bestimmten Benutzer angeben. Dies funktioniert einwandfrei.

Wenn Sie eine Liste von Posts aufrufen, werden die Dinge ineffizient, weil Sie für jeden Autor einen extra API-Aufruf für jeden Post machen müssen. Ich löste das, indem ich NESTED-Ressourcen anstelle von HYPERLINKED-Ressourcen einsetzte, sodass jeder Beitrag nun alle Informationen über den Autor enthält.

{ 
    "path": "http://api.myproject.com/posts/1.json", 
    "id": 1, 
    "author": { 
     "email": "[email protected]" 
     "username": "broak", 
     "first_name: "John", 
     "last_name": "Broak", 
     "is_staff": False, 
     "is_active": True, 
     "last_login": "02-26-2016" 
    }, 
    "image": "/images/posts/cxyUzlPo.jpg", 
    "header": "Who am I?", 
    "footer": "I am a champion!", 
    "date": "2014-11-09 15:16", 
    "likes": "http://api.myproject.com/posts/1/likes.json", 
    "comments": "http://api.myproject.com/posts/1/comments.json", 
    "likes_count": 0, 
    "comments_count": 0 
} 

Meine erste Frage ist: Haben Sie einen Leitfaden haben, ob ich eine verschachtelte Datenstruktur oder einen separaten Endpunkt mit Hyperlink es schaffen sollte.

Meine zweite Frage ist: Wenn ich Autor als verschachtelte Ressource verwenden und einen neuen Beitrag erstellen möchte, möchte ich nicht alle Informationen über den Autor angeben (Benutzername, E-Mail, ...). Gibt es eine Möglichkeit, einen Link zu einem Benutzer für die Operation CREATE/UPDATE einfach zu verwenden? Oder ändern Sie etwas, so dass die Benutzer-ID ausreicht, um dieses Feld auszufüllen?

Antwort

7

Wenn ich Ihre Frage richtig verstanden habe, möchten Sie Autor erweitert haben, während Sie die Daten abrufen und einfach ID oder URL im Falle eines Updates senden und erstellen möchten.

1# Es geht nicht um irgendeine Richtlinie und es hängt vollständig von Ihrer Anforderung ab, wie Ihre api verwendet wird.

2# Sie müssen also Ihre UserSerializer erweitern und to_internal_value überschreiben. Beispielcode aussehen könnte

class MyCustomSerializer(UserSerializer): 
    def to_internal_value(self, data): 
     # data must be valid user-detail url 
     return serializers.HyperLinkedRelatedField(queryset=User.objects.all(), view_name='user-detail').to_internal_value(data) 

Hinweis, dass Sie einen Endpunkt für Benutzer-Detail in der Lage, müssen mit HyperLinkedRelatedField zu arbeiten.

Also, wenn Sie in der Lage sein möchten, senden ID dann Codebeispiel aussehen könnte

class MyCustomSerializer(UserSerializer): 
    # data must be valid user id 
    def to_internal_value(self, data): 
     return serializers.PrimaryKeyRelatedField(queryset=User.objects.all()).to_internal_value(data) 

Allerdings würde Ich mag Konsistenz halten in POST/PUT/PATCH ForeignKey Feld zu schicken. (Immer entweder URL oder ID).

verwenden Sie es dann in Ihrem Code wie

class PostSerializer(serializers.HyperlinkedModelSerializer): 
    author = MyCustomSerializer() 

    class Meta: 
     model = Post 

Bitte beachten Sie die Dokumentation auf Writable nested serializers-POST auf einer Nested-Ressource.

Verwandte Themen