您似乎正在寻找一个只写字段。因此,创建时需要该字段,但它根本不会显示给用户(与只读字段相反)。幸运的是,Django REST Framework 现在支持带有the write_only attribute 的只写字段。
在 Django REST Framework 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 的用户,对吗?),您还需要在密码进入时对其进行哈希处理。这应该在您的视图中完成,很可能通过覆盖perform_create 和 perform_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 Framework 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)
这将解决其他答案的常见问题,即用于创建/更新用户的相同序列化程序也将用于返回更新后的用户对象作为响应。这意味着密码仍将在响应中返回,即使您只希望它是只写的。这样做的另一个问题是密码可能会或可能不会在响应中进行哈希处理,这是您真正不想做的事情。