【问题标题】:Different logic for serializer on get and create获取和创建序列化程序的不同逻辑
【发布时间】:2018-09-10 20:52:42
【问题描述】:

我想使用一个序列化程序来创建 cmets 并获取它们的列表。

这是我的评论序列化器:

class CommentSerializer(serializers.ModelSerializer):
    creator = UserBaseSerializer(source='author')
    replies = ShortCommentSerializer(many=True, read_only=True)
    reply_on = serializers.PrimaryKeyRelatedField(
        queryset=Comment.objects.all(),
        write_only=True,
        allow_null=True,
        required=False
    )
    author = serializers.PrimaryKeyRelatedField(
        queryset=get_user_model().objects.all(),
        write_only=True
    )

    class Meta:
        model = Comment
        fields = ('id', 'text', 'object_id', 'creator', 'replies', 'reply_on',
                  'author')
        extra_kwargs = {
            'text': {'required': True},
            'object_id': {'read_only': True}
        }

    def create(self, validated_data):
        validated_data.update(
            {'content_type': self.context['content_type'],
             'object_id': self.context['pk']}
        )
        return Comment.objects.create(**validated_data)

我的Comment 模型具有字段author,它是用户模型的外键。在 GET 方法中,我将 creator 作为带有 source='author' 的 NestedSerializer 返回。我还得到了author 字段,仅用于写入目的。我试图弄清楚是否可以使用author 字段进行读写。

【问题讨论】:

  • 在我看来,作者应该是当前登录的用户,你不必(实际上,你不应该)从前端获取它的值,你可以将它分配给您的视图或序列化程序,因此您可以将名称作者留作只读使用(UserBaseSerializer)。看看我对另一个问题的回答,也许会给你一些想法:stackoverflow.com/a/51942497/6177831
  • @changak 谢谢,它帮助了我!

标签: django django-rest-framework


【解决方案1】:

听起来您想要Writable Nested Serializer。通过定义create,您走在了正确的轨道上,但链接的文档应该有望为如何实现这一点提供一个好主意。您可以避免遍历您的可写字段,因为它不是many 关系。

【讨论】:

    【解决方案2】:

    您可以尝试像这样覆盖方法 get_serializer_class:

    def get_serializer_class(self):
        if self.request.method == 'POST':
            return CommentCreateSerializer
        return CommentSerializer
    

    在CommentCreateSerializer中,可以直接写author字段。和source='author' 的 CommentSerializer 仅用于 api 获取。

    帮顶一下

    【讨论】:

      猜你喜欢
      • 2021-04-18
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多