Django REST Framework создание API: Урок 11, методы и поля сериализатора
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Руководства «Django»
Комментариев: 0

В уроке 11 по созданию API на Django REST Framework, мы рассмотрим, методы и поля сериализатора модели.

Предыдущий урок: Django REST Framework создание API: Урок 10, ViewSets и Routers

Мы рассмотрим методы передаваемый в API, получение ссылки на пост и т.д.

Давайте начнем, как пример мы будем использовать наш созданный сериализатор:

modules\blog\serializers\articles.py

from rest_framework import serializers
from modules.blog.models import Article


class ArticleSerializer(serializers.ModelSerializer):
    """
    Сериализатор для модели "Статьи"
    """
    class Meta:
        model = Article
        fields = '__all__'

Сейчас он выглядит так, и выдает нам следующий вид в API:

Давайте выдадим ссылку на на полную статью, чтоб из данного API мы могли перейти к одному экземпляру статьи.

Можно это сделать двумя способами:

Первый, создавая метод:

modules\blog\serializers\articles.py

from rest_framework import serializers
from rest_framework.reverse import reverse
from modules.blog.models import Article


class ArticleSerializer(serializers.ModelSerializer):
    """
    Сериализатор для модели "Статьи"
    """

    absolute_url = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Article
        fields = [
            'pk',
            'title',
            'slug',
            'created_by',
            'short_description',
            'full_description',
            'created_at',
            'updated_at',
            'is_published',
            'is_fixed',
            'absolute_url'
        ]

    def get_absolute_url(self, obj):
        request = self.context.get('request')
        return reverse('api_articles_detail_update_delete', kwargs={'slug': obj.slug}, request=request)

Пояснение:

  • Мы создаем поле сериализатора, в котором ставим возможность только для чтения. 
    • absolute_url = serializers.SerializerMethodField(read_only=True)
  • Сам метод должен называться всегда так get_название_поля
    • get_absolute_url(self, obj)
      • Метод принимает сериализатор, и объект.
      • Метод аналогичен тому, что мы обычно пишем в обычной модели Django для получения детальной ссылки, только с некоторыми изменениями.
      • В метод не забываем передать name, который мы задавали в urls.py для views.
      • В параметры kwargs передаем slug и само поле объекта slug.

Смотрим результат:

Вы можете не добавлять request, тогда ссылка получится без http://127.0.0.1:8000:

modules\blog\serializers\articles.py

    def get_absolute_url(self, obj):
        return reverse('api_articles_detail_update_delete', kwargs={'slug': obj.slug})

Второй способ, с помощью поля HyperlinkedIdentityField.

modules\blog\serializers\articles.py

class ArticleSerializer(serializers.ModelSerializer):
    """
    Сериализатор для модели "Статьи"
    """

    absolute_url = serializers.HyperlinkedIdentityField(view_name='api_articles_detail_update_delete', lookup_field='slug')

    class Meta:
        model = Article
        fields = [
            'pk',
            'title',
            'slug',
            'created_by',
            'short_description',
            'full_description',
            'created_at',
            'updated_at',
            'is_published',
            'is_fixed',
            'absolute_url'
        ]

Пояснение:

  • В HyperlinkedIdentityField передаем название, заданное в urls.py для данного контроллера, в lookup_field передаем по чему мы хотим получать ссылку, в нашем случае по slug экземпляра.

Результат:

Давайте рассмотрим, как можно передать дату и время в привычном виде:

from rest_framework import serializers
from rest_framework.reverse import reverse
from modules.blog.models import Article


class ArticleSerializer(serializers.ModelSerializer):
    """
    Сериализатор для модели "Статьи"
    """

    absolute_url = serializers.HyperlinkedIdentityField(view_name='api_articles_detail_update_delete', lookup_field='slug')
    time_create = serializers.DateTimeField(source='created_at', format='%d %B %Y')

    class Meta:
        model = Article
        fields = [
            'pk',
            'title',
            'slug',
            'created_by',
            'short_description',
            'full_description',
            'time_create',
            'updated_at',
            'is_published',
            'is_fixed',
            'absolute_url'
        ]

Пояснение:

  • Я добавил поле сериализатора time_create = serializers.DateTimeField()
    • В него я передал параметр source - из какого поля модели мы можем ссылаться, в нашем случае поле модели created_at.
    • Назначил format в привычный вид для чтения дат.
  • Удалил поле created_at из сериализатора.

Результат:

На этом все, далее мы рассмотрим связи ForeignKey, ManyToMany, OneToOne в сериализаторе.

Более подробно можете ознакомиться в официальной документации к DRF

Теги записи: Django, Django REST Framework, API, DRF,
Комментарии к статье 0
Комментариев нет
Форма добавления комментария (необходима регистрация)