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

Serialization djagno rest框架-序列化程序代码未执行,serialization,hash,passwords,django-rest-framework,password-hash,Serialization,Hash,Passwords,Django Rest Framework,Password Hash,我正在尝试使用密码哈希实现用户注册 问题在于密码是原始保存的(键入时) 出于某种原因,我认为序列化程序中的创建方法没有被调用 不管我是否注释掉该方法,并尝试注册,相同的结果-将用户保存到数据库而不散列密码-意味着代码不会执行 视图.py class UserViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin,

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

问题在于密码是原始保存的(键入时)

出于某种原因,我认为序列化程序中的创建方法没有被调用

不管我是否注释掉该方法,并尝试注册,相同的结果-将用户保存到数据库而不散列密码-意味着代码不会执行

视图.py

class UserViewSet(mixins.CreateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.ListModelMixin,
               viewsets.GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsCreationOrIsAuthenticated,)
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
Serizliers.py

class UserViewSet(mixins.CreateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.ListModelMixin,
               viewsets.GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsCreationOrIsAuthenticated,)
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
我已经为此挣扎了一段时间-不能有密码


有什么想法吗?

不要在
serializers.py
中编写
create
方法,而是覆盖
视图.py
中的
perform\u create()
方法。为了在创建对象时做一些额外的工作,DRF提供了这个钩子。这将使代码更加干净和干燥

根据DRF文件

保存和删除挂钩:

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

执行_create(self,serializer)-当 正在保存新对象实例。
执行_更新(自、序列化程序)- 保存现有对象实例时由UpdateModelMixin调用。
perform_destroy(self,instance)-当 正在删除对象实例。
这些钩子对你来说特别有用 设置请求中隐含但不是部分的属性 请求数据的类型

您可以通过以下方式实现:

视图.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()

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

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

您的
create
方法被标记到
Meta
类中,而不是序列化器类中。您需要将其解压一次,使其位于正确的行上。请检查缩进中的
create()
method哇,这是一个多么愚蠢的错误。。谢谢!现在可以了。谢谢你的回答,但是很明显create方法的缩进有问题。。真蠢