在create()中访问SerializerMethodField

时间:2017-04-26 02:26:05

标签: python django django-rest-framework

我想在服务器端创建密码并将其发送回用户。以下是我写的代码:

class ASCreateSerializer(serializers.Serializer):
    name = serializers.CharField(write_only = True)
    password = serializers.SerializerMethodField()

    def get_password(self, obj):
        from django.utils.crypto import get_random_string
        password = get_random_string(length=16)
        return password

    def create(self, validated_data):
        name = validated_data['name']
        as = AS.objects.get_or_create(name = name,
                    password = validated_data['password']
                )

我收到密码'的密钥错误。如何在SerializerMethodField中访问create()的值?

2 个答案:

答案 0 :(得分:0)

SerializerMethodFieldDoc)是一个只读字段。当您想要计算给定对象的字段时使用此字段,因此如果您正在接收输入(写例),则不需要此字段。因此,在您的情况下,您可以在create方法中生成密码,并且在序列化程序中只有name

答案 1 :(得分:0)

您可以通过@Andrey Shipilov提到的get_password()来访问self.get_password()方法。但是从obj的定义中删除了不必要的第二个参数get_password()

如果您需要将随机密码保存到数据库并将其作为响应返回,请考虑执行以下操作:

def create_password():
    from django.utils.crypto import get_random_string
    password = get_random_string(length=16)
    return password

class ASCreateSerializer(serializers.Serializer):
    name = serializers.CharField(write_only = True)
    password = serializers.CharField()

    def create(self, validated_data):
        name = validated_data['name']
        as = AS.objects.get_or_create(
                name = name,
                password = create_password()
            )