Python Django Rest Framework: метод `.create ()` по умолчанию не поддерживает записываемые вложенные поля - PullRequest
0 голосов
/ 05 августа 2020

Я использую django rest framework для создания конечной точки api. Я использую стандартную модель пользователя django предлагает. Мне нужно создать сообщение, которое использует пользователя в качестве внешнего ключа. Пользователь с именем «автор» в сообщении может иметь несколько сообщений.

Это пример сообщения json.

[
    {
        "author": {
            "id": 1,
            "username": "sorin"
        },
        "title": "First Post",
        "description": "Hello World!",
        "created_at": "2020-08-05T14:20:51.981163Z",
        "updated_at": "2020-08-05T14:20:51.981163Z"
    }
]

Это модель.

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    description = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

Это сериализатор.

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'username')


class PostSerializer(serializers.HyperlinkedModelSerializer):

    author = UserSerializer()

    class Meta:
        model = Post
        fields = ('author', 'title', 'description', 'created_at', 'updated_at')

Я получаю сообщение об ошибке «Метод .create() по умолчанию не поддерживает записываемые вложенные поля». при попытке отправить почтовый запрос с использованием «имени пользователя», «заголовка» и «описания».

Есть помощь, как решить эту проблему?

1 Ответ

0 голосов
/ 06 августа 2020

Мне нравится подключать функцию create сериализатора для подобных случаев использования. Убедитесь, что ваш UserSerializer установлен на read_only=True.

class PostSerializer(serializers.HyperlinkedModelSerializer):

    author = UserSerializer(read_only=True)

    class Meta:
        model = Post
        fields = ('author', 'title', 'description', 'created_at', 'updated_at')

    def create(self, validated_data):
       request = self.context['request']
       author_data = request.data.get('author')
       if author is None or not isinstance(author.get('id'), int):
           raise ValidationError({'author': ['This field is invalid.']})
       author_instance = get_object_or_404(User, id=author.get('id'))
       return Post.objects.create(author=author_instance, **validated_data)
...