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

时间:2015-06-07 17:47:51

标签: serialization hash passwords django-rest-framework password-hash

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

问题是密码是原始保存的(因为它是键入的)。

出于某种原因,我认为序列化器中的 create方法不会被称为

如果我将方法注释掉或不注释,并尝试注册,同样的结果 - 无关紧要 - 将用户保存到数据库而不哈希密码 - 这意味着代码没有'执行??

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

我一直在努力解决这个问题 - 无法拥有密码。

有什么想法吗?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

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

UserSerializer类(serializers.ModelSerializer):

lazy