gpt4 book ai didi

django - 动态更改序列化程序字段

转载 作者:行者123 更新时间:2023-12-04 09:14:30 24 4
gpt4 key购买 nike

例如,我有以下序列化程序:

class UserSerializer(serializers.ModelSerializer):

class Meta:
model = User
fields = (
'userid',
'password'
)

但是我不想在 GET 上输出密码(当然在我的真实示例中还有其他字段)。在不编写其他序列化程序的情况下如何做到这一点?即时更改字段列表。有没有办法做到这一点?

最佳答案

您似乎正在寻找一个只写字段。因此该字段在创建时是必需的,但它根本不会显示给用户(与只读字段相反)。幸运的是,Django REST Framework 现在支持只写字段 the write_only attribute .

在 Django REST 框架 3.0 中 ,你只需要添加额外的参数 to the extra_kwargs meta option .

class UserSerializer(serializers.ModelSerializer):

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

因为 password应该散列(您正在使用 Django 的用户,对吗?),您还需要在输入密码时对其进行散列。这应该在您的 View 中完成,最有可能通过覆盖 perform_createperform_update方法。
from django.contrib.auth.hashers import make_password

class UserViewSet(viewsets.ViewSet):

def perform_create(self, serializer):
password = make_password(self.request.data['password'])

serializer.save(password=password)

def perform_update(self, serializer):
password = make_password(self.request.data['password'])

serializer.save(password=password)

在 Django REST 框架 2.x 中 ,您需要完全重新定义 password序列化器上的字段。
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)

class Meta:
model = User
fields = (
'userid',
'password'
)

为了在 Django REST Framework 2.x 中提前散列密码,您需要覆盖 pre_save .
from django.contrib.auth.hashers import make_password

class UserViewSet(viewsets.ViewSet):

def pre_save(self, obj, created=False):
obj.password = make_password(obj.password)

super(UserViewSet, self).pre_save(obj, created=created)

这将解决其他答案的常见问题,即用于创建/更新用户的相同序列化程序也将用于返回更新的用户对象作为响应。这意味着密码仍将在响应中返回,即使您只希望它是只写的。这样做的另一个问题是密码可能会或可能不会在响应中散列,这是您真正不想做的事情。

关于django - 动态更改序列化程序字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27468552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com