【问题标题】:Django Rest Framework - serializer code not executingDjango Rest Framework - 序列化程序代码未执行
【发布时间】:2015-08-22 04:19:15
【问题描述】:

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

问题是密码保存为原始密码(输入时)。

由于某种原因,我认为序列化程序中的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

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

有什么想法吗?

【问题讨论】:

  • 您的create 方法被标记到它位于Meta 类而不是序列化程序类中的位置。您需要取消它一次,以便它在正确的行上。
  • 请检查create()方法的缩进
  • 哇,多么愚蠢的错误.. 非常感谢!现在它的工作。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    根据 DRF 文档,

    保存和删除钩子:

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

    perform_create(self, serializer) - 由 CreateModelMixin 调用 保存一个新的对象实例。
    perform_update(self, 序列化程序) - 保存现有对象实例时由 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()
    

    【讨论】:

    • 感谢您的回答,但显然 create 方法的缩进存在问题.. 真的很愚蠢
    猜你喜欢
    • 2023-03-10
    • 2018-05-20
    • 2016-12-18
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2016-02-09
    • 2019-05-23
    相关资源
    最近更新 更多