Как установить категорию каждого элемента внутри ответа в rest framework django?

#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. Я исправил эту ошибку, создав другой настраиваемый сериализатор.