Wir müssen die Beziehung zwischen Entitäten im Web-API-Design implementieren. Es gibt mehrere Möglichkeiten, das zu tun (wie auf der DRF Dokumentation erwähnt):
- Mit Primärschlüssel.
- Verwenden von Hyperlinks zwischen Entitäten.
- Verwenden eines eindeutigen identifizierenden Slug-Feldes für die zugehörige Entität.
- Verwenden der Standardzeichenfolgendarstellung der verknüpften Entität.
- Verschachteln der zugehörigen Entität innerhalb der übergeordneten Repräsentation.
- Einige andere benutzerdefinierte Darstellung
Die HyperlinkedModelSerializer folgende Unterschiede von ModelSerializer hat:
- Es beinhaltet nicht die ID-Feld in der Standardeinstellung.
- Es enthält ein URL-Feld mit HyperlinkedIdentityField.
- 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: IhrKennwort 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
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
Das Ergebnis wird zu ändern:
"results": [
{
"email": "[email protected]",
"groups": [
1,
2
],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
}
]
Schöne Antwort, ich würde nur eine Sache hinzufügen: Verwendung von Hyperlinks in Ihren Ressourcen wird es einfacher für jeden Entwickler mit Ihrer Web-API. Wenn sie den gesamten Ressourcen-URI sehen können, brauchen sie keine Dokumentation oder andere Wege, um das herauszufinden. – xleon