Python Django Rest Framework:默认情况下,.create()方法不支持可写的嵌套字段

时间:2020-08-05 15:57:25

标签: python django django-rest-framework

我正在使用django rest框架创建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 :(得分:0)

对于这种用例,我喜欢挂在序列化器的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)