django rest框架-序列化程序代码未执行

问题描述 投票:0回答:2

我正在尝试通过密码哈希实现用户注册。

问题密码是原始保存的(按输入)。

出于某种原因,我认为未在序列化程序中创建方法

无论我注释掉该方法还是不注释掉它都没关系,并尝试注册,结果相同-将用户保存到数据库而不散列密码-意味着代码不执行? ?

Views.py

class UserViewSet(mixins.CreateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.ListModelMixin,
               viewsets.GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsCreationOrIsAuthenticated,)

Serizliers.py

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'password', )
        extra_kwargs = {'password': {'write_only': True}}

        def create(self, validated_data):
            user = User(
                first_name=validated_data['first_name'],
                username=validated_data['username'],
                last_name=validated_data['last_name']
            )
            user.set_password(validated_data['password'])
            user.save()
            return user

我已经为此苦苦挣扎了一段时间-无法获得密码。

有什么想法吗?

serialization hash passwords django-rest-framework password-hash
2个回答
1
投票

create函数在目标类中,它必须在主类中,删除缩进选项卡

类UserSerializer(serializers.ModelSerializer):

class Meta:
    model = User
    fields = ('username', 'first_name', 'last_name', 'password', )
    extra_kwargs = {'password': {'write_only': True}}

def create(self, validated_data):
    user = User(
        first_name=validated_data['first_name'],
        username=validated_data['username'],
        last_name=validated_data['last_name']
    )
    user.set_password(validated_data['password'])
    user.save()
    return user

0
投票

[而不是在create中编写serializers.py方法,而是通过覆盖perform_create()中的views.py方法来完成此工作。为了在创建对象方面做一些额外的工作,DRF提供了此挂钩。这将使代码更加干净和干燥。

根据DRF文档,

保存和删除挂钩:

mixin类提供以下方法,并提供轻松覆盖对象的保存或删除行为。

perform_create(self,serializer)-由CreateModelMixin调用,当保存一个新的对象实例。perform_update(self,serializer)-保存现有对象实例时,由UpdateModelMixin调用。perform_destroy(self,instance)-由DestroyModelMixin调用,当删除对象实例。这些挂钩对于设置在请求中隐含但不属于请求的属性请求数据。

您可以通过以下方式进行此操作:

views.py

def perform_create(self, serializer):
    user = User(
            first_name=serializer.data['first_name'],
            username=serializer.data['username'],
            last_name=serializer.data['last_name']
        )
    user.set_password(serializer.data['password'])
    user.save()
© www.soinside.com 2019 - 2024. All rights reserved.