web-dev-qa-db-ger.com

Was ist der Vorteil der Verwendung eines HyperlinkedModelSerializer in DRF?

In Bezug auf diesen Link habe ich viele Beispiele für die Verwendung eines HyperlinkedModelSerializer im Django Rest Framework gesehen. Es sagt:

Die HyperlinkedModelSerializer-Klasse ähnelt der ModelSerializer-Klasse Klasse, außer dass Hyperlinks verwendet werden, um Beziehungen darzustellen, anstelle von Primärschlüsseln.

Meine Frage ist, was ist der Nutzen/Nutzen der Verwendung gegenüber einem regulären Model Serializer? 

34
Tim S.

Der einzige Unterschied besteht darin, dass, wie in der zitierten Zitierung angegeben, Primär- und Fremdschlüssel durch URLs dargestellt werden, die auf diese Ressourcen verweisen, und nicht nur auf tatsächliche Schlüsselwerte. 

Der Vorteil ist, dass Sie in Ihrem Frontend keine Ressourcen-URLs erstellen müssen, wenn Sie verwandte Objekte abrufen möchten.

Eine weitere Sache sind verschachtelte Repräsentationen, mit denen Sie verwandte Objekte in Ihre Serialisiererausgabe integrieren können. Dies kann sowohl mit ModelSerializer als auch mit HyperlinkedModelSerializer kombiniert werden, wenn Sie der Meinung sind, dass es für den API-Benutzer günstiger ist, verwandte Elemente sofort zu haben, anstatt zusätzliche Anforderungen zum Abrufen dieser Elemente zu stellen.

Verschachtelte Repräsentationen können über die Option Meta.depth oder mithilfe des Serializers des verwandten Modells anstelle einer RelatedField implementiert werden.

Wie @xleon in seinem Kommentar unter Verwendung von URLs als Schlüsseln feststellte, ist es für andere Entwickler einfacher, Ihre API zu verstehen.

27
Ivan

Wir müssen eine Beziehung zwischen Entitäten im Web-API-Design implementieren ... Es gibt mehrere Möglichkeiten, dies zu tun (wie in der DRF-Dokumentation erwähnt):

  • Verwenden von Primärschlüsseln 
  • Verwenden von Hyperlinks zwischen Entitäten. 
  • Verwenden eines eindeutigen identifizierenden Slug-Felds für die zugehörige Entität. 
  • Verwenden der Standardzeichenfolgendarstellung der zugehörigen Entität. 
  • Verschachtelung der zugehörigen Entität in der übergeordneten Darstellung. 
  • Eine andere benutzerdefinierte Darstellung

Der HyperlinkedModelSerializer weist die folgenden Unterschiede zu ModelSerializer auf:

  • Das Feld id ist standardmäßig nicht enthalten.
  • Es enthält ein URL-Feld, das HyperlinkedIdentityField verwendet.
  • Beziehungen verwenden HyperlinkedRelatedField anstelle von PrimaryKeyRelatedField.

Ein einfaches Beispiel:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')

bash> http -a admin: yourpassword http://127.0.0.1:8000/users/

 "results": [
        {
            "email": "[email protected]",
            "groups": [
                "http://127.0.0.1:8000/groups/1/",
                "http://127.0.0.1:8000/groups/2/"
            ],
            "url": "http://127.0.0.1:8000/users/1/",
            "username": "admin"
        }
    ]

Aber wenn Sie sich ändern 

class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('url', 'username', 'email', 'groups')

Das Ergebnis wird sein:

   "results": [
        {
            "email": "[email protected]",
            "groups": [
                1,
                2
            ],
            "url": "http://127.0.0.1:8000/users/1/",
            "username": "admin"
        }
    ]
20
Serjik

Die Kosten für HyperlinkedModelSerializers sollten beachtet werden: Wenn Ihre API das Filtern oder Sortieren über Abfrageparameter in der URL unterstützt, ist es für Ihren Frontend-Benutzer etwas schwieriger, die Hyperlink-URL-Felder zum Erstellen von Abfrageparametern zu verwenden, da diese die Parameter analysieren müssen pk von der URL, anstatt dass der pk direkt verfügbar ist.

Angenommen, ein Objekt auf einer Route bei /api/objects/12/ muss der Verbraucher das Feld url analysieren, um den 12 zu extrahieren, um eine Abfrage zu filtern, die von diesem Objekt an einem anderen Endpunkt gefiltert wird: /api/otherobjects/?object=12. Kein großes Problem, aber eine Schande, wenn Sie eine Menge Filterung planen.

1
Colton Hicks