Abbiamo bisogno di implementare relazioni tra entità nella progettazione di API Web. Ci sono diversi modi per farlo (come menzioni sulla documentazione DRF):
- Utilizzo di chiavi primarie.
- Utilizzo del collegamento ipertestuale tra entità.
- Utilizzo di un campo di identificazione univoco identificativo sull'entità correlata.
- Utilizzo della rappresentazione di stringa predefinita dell'entità correlata.
- Annidamento dell'entità correlata all'interno della rappresentazione padre.
- Qualche altra rappresentazione personalizzato
Il HyperlinkedModelSerializer presenta le seguenti differenze da ModelSerializer:
- non include il campo ID per impostazione predefinita.
- Include un campo url, che utilizza HyperlinkedIdentityField.
- Le relazioni utilizzano HyperlinkedRelatedField, anziché PrimaryKeyRelatedField.
Un semplice esempio:
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: VOSTRAPASSWORD 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"
}
]
Ma se si cambia
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
Il risultato sarà:
"results": [
{
"email": "[email protected]",
"groups": [
1,
2
],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
}
]
Risposta piacevole, vorrei aggiungere solo una cosa: l'utilizzo di collegamenti ipertestuali nelle risorse renderà più semplice per qualsiasi sviluppatore che utilizza l'API Web. Se possono vedere l'intero URI delle risorse, non avranno bisogno di documentazione o altri modi per scoprirlo. – xleon