В чем преимущество использования HyperlinkedModelSerializer в DRF?
В отношении эта ссылка, я видел множество примеров использования HyperlinkedModelSerializer в Django Rest Framework. В нем говорится:
Класс HyperlinkedModelSerializer похож на ModelSerializer класс, за исключением того, что он использует гиперссылки для представления отношений, а не первичные ключи.
Мой вопрос: какой прецедент/польза от использования их против обычного Serializer модели?
Ответы
Ответ 1
Единственное отличие заключается в том, что, как и в цитированной вами цитате, первичный и внешний ключи представлены URL-адресами, указывающими на эти ресурсы, а не только фактическими значениями ключа.
Преимущество в том, что вам не придется создавать URL-адреса ресурсов в своем интерфейсе, когда вы хотите получить связанные объекты.
Еще одна вещь - это вложенные представления, которые позволяют встраивать связанные объекты в ваш выход для сериализатора. Это можно комбинировать с ModelSerializer
и HyperlinkedModelSerializer
, если вы считаете, что потребителю API удобнее иметь связанные элементы сразу же, вместо того, чтобы делать дополнительные запросы для их извлечения.
Вложенные представления могут быть реализованы с помощью опции Meta.depth
или с помощью соответствующего сериализатора модели вместо RelatedField
.
Как сказал @xleon в своем комментарии, используя URL-адреса в качестве ключей, другим разработчикам проще понять ваш API.
Ответ 2
Нам нужно реализовать взаимосвязь между объектами в дизайне веб-API.
Существует несколько способов сделать это (как упоминается в документации DRF):
- Использование первичных ключей.
- Использование гиперссылки между объектами.
- Использование уникального идентифицирующего поля slug для связанного объекта.
- Использование строкового представления по умолчанию для связанного объекта.
- Вложение связанного объекта внутри родительского представления.
- Некоторые другие пользовательские представления
HyperlinkedModelSerializer имеет следующие отличия от ModelSerializer:
- По умолчанию он не включает поле id.
- Он включает поле url, используя HyperlinkedIdentityField.
- Отношения используют HyperlinkedRelatedField, а не PrimaryKeyRelatedField.
Простой пример:
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"
}
]
Но если вы измените
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
Результат будет:
"results": [
{
"email": "[email protected]",
"groups": [
1,
2
],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
}
]