首页 > 解决方案 > 从序列化程序中的模型获取自动生成的字段,而不返回它

问题描述

我有一个用于邀请新用户的序列化程序。在此序列化程序使用的用户模型中,有一个自动生成的激活密钥字段(通过电子邮件发送给用户)。在序列化程序中干净地获取激活密钥的最佳方法是什么,而不是将它添加到将在响应中返回的 User 对象?出于显而易见的原因,我不希望将激活密钥返回到前端。

模型.py:

class User(AbstractBaseUser):
    ...
    activation_key = models.UUIDField(unique=True, default=uuid.uuid4)  
    ...

序列化程序.py:

class UserInvitationSerializer(serializers.ModelSerializer):
    email = serializers.EmailField()

    class Meta:
        model = User
        fields = ('id', 'email', 'first_name', 'last_name')

    def create(self, validated_data):

        user = User.objects.create(**validated_data)
        random_pass = User.objects.make_random_password(length=10)
        user.set_password(random_pass)
        user.save()

        activation_key = ?
        send_mail('Email Address Verification Request', 'confirm/email/(?P<activation_key>.*)/$', 'info@mydomain',[user.email])

        return user

标签: pythondjangodjango-rest-framework

解决方案


activation_key是自动生成的。

create()您已经User创建了实例,因此您可以从该对象中获取激活密钥:

class UserInvitationSerializer(serializers.ModelSerializer):
    email = serializers.EmailField()

    class Meta:
        model = User
        fields = ('id', 'email', 'first_name', 'last_name')

    def create(self, validated_data):

        user = User.objects.create(**validated_data)
        random_pass = User.objects.make_random_password(length=10)
        user.set_password(random_pass)
        user.save()

        activation_key = user.activation_key
        send_mail('Email Address Verification Request', 'confirm/email/(?P<activation_key>.*)/$', 'info@mydomain',[user.email])

        return user

考虑到您明确指定fieldsModelSerializer应该返回的内容,activation_key不会显示在 API 响应中。


推荐阅读