#python #django #api #rest #django-rest-framework
Вопрос:
У меня есть две такие модели:
class Category(models.Model):
title = models.CharField(max_length=256)
class Post(models.Model):
title = models.CharField(max_length=256, default=None, blank=True)
content = models.TextField()
created_at = models.DateTimeField(auto_now=True)
category_id = models.ForeignKey(Category, on_delete=models.CASCADE)
И иметь два сериализатора:
class CategorySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Category
fields = ['id', 'title']
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['id', 'title', 'content', 'created_at', 'category_id']
Как подготовить такой ответ:
"data": [
{
"id": 1,
"title": "Hello1",
"content": "Hello content1",
"created_at": "2021-09-25T07:57:23.532416Z",
"category_id": 11,
"category": {"id":11 , "title":"Category1"}
},
{
"id": 2,
"title": "Hello2",
"content": "Hello content2",
"created_at": "2021-09-25T08:08:37.984310Z",
"category_id": 12,
"category": {"id":12 , "title":"Category2"}
}
]
Ответ №1:
Вы добавляете Category
субсериализатор:
class PostSerializer(serializers.ModelSerializer):
category = CategorySerializer()
class Meta:
model = Post
fields = ['id', 'title', 'content', 'created_at', 'category', 'category_id']
Комментарии:
1. Я получил эту ошибку: Получил ошибку атрибута при попытке получить значение для поля
category
в сериализатореPostSerializer
. Поле сериализатора может быть названо неправильно и не соответствовать какому-либо атрибуту или ключу вPost
экземпляре. Исходный текст исключения гласил: объект «Сообщение» не имеет атрибута «категория».2. @reza_khalafi: вы должны переименовать
ForeignKey
изcategory_id
вcategory
, нет смысла добавлять_id
суффикс: django-antipatterns.com/antipattern/…3. При попытке создать публикацию с этими данными: заголовок:A_POST содержание:A_CONTENT категория:1 , получите следующее: «категория»: [ «Это поле обязательно».]
4. Я исправил эту ошибку, создав другой настраиваемый сериализатор.