我正在尝试通过 Django Rest Framework API 调用使我的用户模型 RESTful,以便我可以创建用户并更新他们的个人资料。
但是,当我与用户进行特定的验证过程时,我不希望用户在创建帐户后能够更新用户名。我尝试使用 read_only_fields,但这似乎在 POST 操作中禁用该字段,因此我无法在创建用户对象时指定用户名。
我该如何实施呢?现在存在的 API 的相关代码如下。
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'password', 'email')
write_only_fields = ('password',)
def restore_object(self, attrs, instance=None):
user = super(UserSerializer, self).restore_object(attrs, instance)
user.set_password(attrs['password'])
return user
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
serializer_class = UserSerializer
model = User
def get_permissions(self):
if self.request.method == 'DELETE':
return [IsAdminUser()]
elif self.request.method == 'POST':
return [AllowAny()]
else:
return [IsStaffOrTargetUser()]
Thanks!
看来您需要为 POST 和 PUT 方法使用不同的序列化器。在 PUT 方法的序列化器中,您可以仅删除用户名字段(或将用户名字段设置为只读)。
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
serializer_class = UserSerializer
model = User
def get_serializer_class(self):
serializer_class = self.serializer_class
if self.request.method == 'PUT':
serializer_class = SerializerWithoutUsernameField
return serializer_class
def get_permissions(self):
if self.request.method == 'DELETE':
return [IsAdminUser()]
elif self.request.method == 'POST':
return [AllowAny()]
else:
return [IsStaffOrTargetUser()]
检查这个问题django-rest-framework:同一 URL 中独立的 GET 和 PUT 但不同的泛型视图 https://stackoverflow.com/questions/22104487/django-rest-framework-independent-get-and-put-in-same-url-but-different-generic/22107326#22107326
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)