В уроке 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