【问题标题】:Python Django Rest Framework: The `.create()` method does not support writable nested fields by defaultPython Django Rest Framework:`.create()` 方法默认不支持可写嵌套字段
【发布时间】:2020-11-25 20:33:35
【问题描述】:

我正在使用 django rest 框架来创建一个 api 端点。我正在使用 django 提供的默认用户模型。我需要创建一个使用用户作为外键的帖子。帖子中名为“作者”的用户可以有多个帖子。

这是一个 post 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() 方法默认不支持可写嵌套字段。”尝试使用“用户名”、“标题”和“描述”进行发布请求时。

对如何解决这个问题有帮助吗?

【问题讨论】:

标签: python django django-rest-framework


【解决方案1】:

我喜欢在这些用例中挂接序列化程序的创建函数。 确保您的 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)

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 2019-07-22
    • 2018-03-27
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多