获取和创建时串行器的不同逻辑

时间:2018-09-10 20:52:43

标签: django django-rest-framework

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

这是我的评论序列化器:

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,这是FK到用户模型。在GET方法中,我将creator作为NestedSerializer返回source='author'。我也得到author字段,仅用于写目的。我试图弄清楚是否可以同时使用author字段进行读写。

2 个答案:

答案 0 :(得分:0)

听起来您想要Writable Nested Serializer。拥有已定义的create可以使您步入正轨,但是希望链接的文档应该为如何实现此目标提供一个好主意。您可以避免不必遍历可写字段,因为它不是many关系。

答案 1 :(得分:0)

您可以尝试像这样重写方法get_serializer_class:

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

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

获取此帮助