В чем преимущество использования 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"
        }
    ]