Jan*_*fer 2 python django rest python-3.x django-rest-framework
我正在创建UserSerializer
并希望允许用户创建新帐户但禁止他们更改用户名。read_only
我可以应用一个属性,但用户在创建新用户名时将无法设置用户名。但没有它它允许我改变它。required
不幸的是,还有一个属性不能与 read_only 一起使用。没有其他相关属性。一种解决方案是创建 2 个不同的序列化程序,一个用于创建 User,另一个用于更改他,但这似乎是丑陋和错误的做法。您对如何在不编写 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
Run Code Online (Sandbox Code Playgroud)
EDIT2:有一个重复的问题(可能我的是一式两份)在这里
假设您正在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:
....
Run Code Online (Sandbox Code Playgroud)
如果您在更新 ( HTTP PUT
) 或部分更新 ( HTTP PATCH
)时尝试更新用户名字段,序列化程序将从username
字段列表中删除该字段,因此它不会影响数据/模型
UPDATE
为什么上述答案无法使用documentaion API?
从文档
注意:默认情况下
include_docs_urls
将底层 SchemaView 配置为生成公共架构。这意味着视图不会使用请求实例进行实例化。即内部视图 self.request 将是None
。
在答案中,字段是在请求对象的帮助下动态弹出的 。
因此,如果您还希望处理 API 文档,请定义多个序列化程序并有效地使用方法。这就是 DRF 的方式。get_serializer_class()