Сериализатор с внешними ключами, как обрабатывать внешний вид и внутренние запросы?
Я новичок в Django Rest Framework и пытаюсь понять, как работать с сериализатором как для frontend view, так и для backend запросов.
Попробую объяснить лучше. У меня есть такие сериализаторы:
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', )
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ('name', )
class PostSerializer(serializers.ModelSerializer):
author = AuthorSerializer(many=False, read_only=True)
category = CategorySerializer(many=False, read_only=True)
class Meta:
model = Post
fields = ('category', 'id', 'title', 'image', 'slug', 'author', 'excerpt', 'content', 'status', 'published')
Когда я извлекаю сообщение, оно выглядит следующим образом:
{
"category": {
"name": "django"
},
"id": 2,
"title": "Learn Django - Class-Based Permission Checks",
"image": "http://localhost:8000/media/posts/laptop_SWf7fkV.jpg",
"slug": "learn-django-class-based-permission-checks",
"author": {
"username": "admin"
},
"excerpt": "Sed ut quam quis tellus pulvinar maximus. Nulla sodales, felis sed interdum lobortis, mi turpis dictum libero, at imperdiet justo eros a sem. Etiam et laoreet eros, quis gravida neque. Pellentesque vitae sollicitudin erat. Donec faucibus quis diam vitae pellentesque. Proin interdum justo vitae magna pretium egestas. Morbi tortor tortor, vestibulum a sagittis non, vestibulum at dolor. Etiam vulputate bibendum elit, id fermentum dui laoreet a. In ac porttitor lectus, eget tempor massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur imperdiet eu ipsum sit amet aliquet. Integer pharetra metus purus, a porttitor nunc bibendum eu. Aenean magna tellus, consectetur nec est vitae, placerat dapibus neque. Cras et venenatis mauris.",
"content": "Sed ut quam quis tellus pulvinar maximus. Nulla sodales, felis sed interdum lobortis, mi turpis dictum libero, at imperdiet justo eros a sem. Etiam et laoreet eros, quis gravida neque. Pellentesque vitae sollicitudin erat. Donec faucibus quis diam vitae pellentesque. Proin interdum justo vitae magna pretium egestas. Morbi tortor tortor, vestibulum a sagittis non, vestibulum at dolor. Etiam vulputate bibendum elit, id fermentum dui laoreet a. In ac porttitor lectus, eget tempor massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur imperdiet eu ipsum sit amet aliquet. Integer pharetra metus purus, a porttitor nunc bibendum eu. Aenean magna tellus, consectetur nec est vitae, placerat dapibus neque. Cras et venenatis mauris.",
"status": "published",
"published": "2021-09-30T16:37:05.233816Z"
}
А для отображения данных на фронтенде интерфейс идеален, я могу легко получить название категории и имя автора. Проблема возникает, когда мне нужно передать эти данные в конечную точку "create new post". БД ожидает число для автора и категории, но таким образом она получает объект, и это, конечно же, не работает.
Если я изменю сериализатор PostSerializer
на следующий:
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('category', 'id', 'title', 'image', 'slug', 'author', 'excerpt', 'content', 'status', 'published')
это работает, но потом у меня возникают проблемы с фронтендом.
Как я должен это сделать? Должен ли я иметь два разных сериализатора, один для обработки данных frontend, а другой для backend? Или есть способ справиться с этим?
Спасибо!
Вы можете добавить поле 'id' в список полей, отображаемых внешним ключом
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username')
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ('id', 'name')
# Others serializers
Я не думаю, что это лучший способ сделать это, но он работает. Я использовал один сериализатор для обращений к бэкенду и один сериализатор для обращений к фронтенду. Таким образом, у меня всегда есть правильные данные.
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('category', 'id', 'title', 'image', 'slug', 'author', 'excerpt', 'content', 'status', 'published')
class FrontendPostSerializer(serializers.ModelSerializer):
author = AuthorSerializer(many=False, read_only=True)
category = CategorySerializer(many=False, read_only=True)
class Meta:
model = Post
fields = ('category', 'id', 'title', 'image', 'slug', 'author', 'excerpt', 'content', 'status', 'published')
Я уверен, что есть лучший способ сделать это, так что если кто-то знает его, пожалуйста, покажите его.