仅在 GET 而非 POST Django REST Framework 上序列化

sid*_*ber 1 python django-rest-framework

我只希望AnchorSerializer()对 GET 请求进行序列化,以便将序列化的对象作为响应返回。在创建AnchorToUser对象时的 POST 请求中需要一个整数。

class AnchorToUserSerializer(serializers.ModelSerializer):
    # Add the username from the user object relation.
    user = serializers.ReadOnlyField(source='user.username')
    # Serialize the nested anchor.
    anchor = AnchorSerializer() # Should only be used with GET.
    class Meta:
        model = AnchorToUser
        fields = (
            'anchor',
            'user',
            'created_at'
        )
Run Code Online (Sandbox Code Playgroud)

Rah*_*pta 5

也许您可以为GETand使用不同的序列化程序POST。

class AnchorToUserGetSerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source='user.username')
    anchor = AnchorSerializer(read_only=True) # only used for serialization

    class Meta:
        model = AnchorToUser
        fields = ('anchor', 'user', 'created_at')


class AnchorToUserPostSerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source='user.username')
    anchor = serializers.IntegerField(write_only=True) # accept integer values

    class Meta:
        model = AnchorToUser
        fields = ('anchor', 'user', 'created_at')
Run Code Online (Sandbox Code Playgroud)

要决定使用什么序列化程序,您可以覆盖该get_serializer_class()方法。

在您的视图或视图集中,您可以执行以下操作:

def get_serializer_class(self):
    if request.method == 'POST':
        return AnchorToUserPostSerializer
    return AnchorToUserGetSerializer
Run Code Online (Sandbox Code Playgroud)