我正在创造UserSerializer
并希望允许用户创建新帐户但禁止他们更改用户名。有一个read_only
我可以应用该属性,但用户在创建新用户名时将无法设置用户名。但如果没有它,它允许我改变它。还有一个required
不幸的是,该属性不能与 read_only 一起使用。没有其他相关属性。
一种解决方案是创建两个不同的序列化器,一个用于创建用户,另一个用于更改他,但这似乎是丑陋且错误的做法。对于如何在不编写 2 个序列化器的情况下实现这一目标,您有什么建议吗?
感谢您的任何建议。
PS:我使用的是python3.6和django2.1
编辑:我正在使用generics.{ListCreateAPIView|RetrieveUpdateDestroyAPIView}
视图类。像这样:
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetails(generics.RetrieveUpdateAPIView):
# this magic means (read only request OR accessing user is the same user being edited OR user is admin)
permission_classes = (perm_or(ReadOnly, perm_or(IsUserOwner, IsAdmin)),)
queryset = User.objects.all()
serializer_class = UserSerializer
EDIT2:有一个重复的问题(可能我的问题是重复的)here https://stackoverflow.com/questions/22124555/django-rest-framework-disable-field-update-after-object-is-created/22133032
假设您正在使用viewset
类为您的视图,那么您可以覆盖init
序列化器的方法为,
class UserSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if 'view' in self.context and self.context['view'].action in ['update', 'partial_update']:
self.fields.pop('username', None)
class Meta:
....
如果您尝试在更新时更新用户名字段(HTTP PUT
)或部分更新(HTTP PATCH
),序列化器将删除username
字段列表中的字段,因此它不会影响数据/模型
UPDATE
为什么上面的答案不起作用文档API?
来自doc http://www.django-rest-framework.org/topics/documenting-your-api/
注意:默认情况下include_docs_urls
配置底层 SchemaView 以生成公共架构。这意味着视图不会使用请求实例进行实例化。即在视图内部 self.request 将是None
.
在答案中,字段是pops out 动态地在一个的帮助下request object.
因此,如果您还希望处理 API 文档,请定义multiple序列化器和使用get_serializer_class()
方法有效。这就是 DRF 的方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)