Django Rest Framework如何禁止用户更改用户名?

2024-04-19

我正在创造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(使用前将#替换为@)

Django Rest Framework如何禁止用户更改用户名? 的相关文章

随机推荐

  • 即使其中一项作业失败,如何将 azure devops 管道结果设置为成功

    我正在开发一个 Azure CD YAML 管道 以将 CI 管道的结果部署到虚拟机上 现在 出于本文的目的 稍微简化一下 CD 管道非常简单 由一个包含 3 个作业的阶段组成 第一个作业运行脚本来停止某种复杂的应用程序 这有时会失败 仅当
  • 当我调试和单步执行时,如何阻止 Xcode 显示该汇编语言?

    我未选中 显示反汇编 但经过几步后 它仍然显示 这可能是使用发布配置而不是调试配置编译的代码 在这种情况下 Xcode 将机器指令与源代码行关联起来会更加困难
  • 我可以使用单个 websocket 服务器同时打开 2 个端口吗

    我是 websocket 编程的新手 目前我正在开发一个简单的 websocket 服务器 使用 c 可以响应 websocket 客户端 我设法在单个端口上使用 1 个客户端和 1 个服务器 我想知道是否可以打开 2 个端口 以便不同的客
  • 获取两个字典列表之间的差异(增量)

    我有以下 Python 数据结构 data1 name u String 1 name u String 2 data2 name u String 1 name u String 2 name u String 3 我正在寻找获得两个列表
  • DataGridTemplateColumn 中的 ComboBox 不显示 SelectedItem

    我想制作其中包含 ComboBox 的自定义 DataGrid 列 组合框的 ItemSource 绑定到枚举 组合框的 selecteditem 绑定到集合元素中选定的枚举值 这是代码
  • 保持java套接字打开?

    我正在制作一个会自动更新的程序 游戏 我有更新部分 但没有检查版本 我本以为这会很容易 这就是我所做的 我为游戏编写了一个更新程序 并且编写了一个服务器 每次客户端 更新程序连接时 服务器都会启动一个线程 线程处理一切 游戏更新程序读取一个
  • Symfony 2 功能测试外部 URL

    无论我做什么 我总能得到一个 Symfony Component HttpKernel Exception NotFoundHttpException 否 已找到 的路线 in crawler gt text 当我尝试使用以下命令请求外部
  • 如何向 img 标签添加到期日期?

    我正在使用 Page Speed Firebug 扩展来帮助提高页面性能 我有一个包含大量图像的页面 它提出的建议之一是 利用浏览器缓存 以下可缓存资源的新鲜生命周期较短 指定以下资源至少在未来一周后到期 http www mysite c
  • 使用Jquery打印div内容

    我想使用 jQuery 打印 div 的内容 这个问题已经在 SO 中提出 但我找不到正确的 有效的 答案 这是我的 HTML div p This is a sample text for printing purpose p div
  • PostgreSQL 恢复后,我收到“关系 django_session 的权限被拒绝”

    我目前正在实时服务器和本地运行我的 Django 1 1 1 站点和 PostgreSQL 8 4 2 当我尝试从本地机器上的实时服务器恢复我的备份之一时 在本地访问我的站点时出现以下错误 http 本地主机 8000 http local
  • Nodejs 在异步上创建简单队列

    在下面的示例代码中 我可以同时运行多功能 Promise all sendMoneyToRequestedUser data saveTransferMoneyTransaction data then function results l
  • 如何在保存到数据库之前在JSP中转义html?

    我现在正在学习 JSP 和 Java 并写了一个 非常 简单的留言簿来开始使用 JSP 但我想确保没有人可以使用 CSS 因此我需要在将 HTML 代码保存到 mySQL 数据库之前删除它 我已经在这里搜索并找到了 PreparedStat
  • 更改 MVC 5 中的用户名 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在使用 ASP NET MVC5 和 Identity 2 0 测试版 用户可以更改用户名吗 我正在尝试使用 Use
  • IActionFilter 与 IResultFilter

    请解释一下 IActionFilter 和 IResultFilter 之间的区别 我了解 OnActionExecuting 发生在操作方法执行之前 OnActionExecuted 发生在操作方法执行之后 进一步了解执行操作方法意味着什
  • 如何让 firebase deploy --email 或 --token 参数起作用?

    我在使用这些 firebase 命令通过 firebase 部署 travis CI 时遇到问题 firebase deploy email FIREBASE USERNAME password FIREBASE PASSWORD fire
  • 通过javascript在html表格中动态添加一列

    我正在编写一个java脚本代码 它将在html中已经存在的表中动态附加一列复选框 我的 html 代码是这样的 table border 1 tr th Email id th th Em th tr table
  • QSignal Manager - 无法将多个信号连接到一个插槽

    我有 4 个 QLineEdits 和 4 个 QPushButtons 如果我单击 QPushButton 我想在相应的 QLineEdit 内设置一些文本 我想使用QSignalMapper来区分每个QButton及其对应的QLineE
  • 用于教育目的的公共 SQL 数据库

    我正在寻找一个可以免费访问的公开可用的 SQL 数据库 可以在其中运行一些SELECT免费查询一些有意义的数据 不是 item1 item2 item3 你见过吗 如果能附上一些教程就更好了 供应商并不那么重要 只要可以使用通用 JDBC
  • 复杂类型中的 XJC javaType 适配器

    我想让 XJC 在生成 bean 时在复杂类型中使用 javaType 标记 这是不允许的吗 我真的缺少好的文档和一些可以理解的错误消息 这是我正在尝试的操作 但失败并出现错误 编译器无法支持此转换自定义 它附加到错误的位置 或者与其他绑定
  • Django Rest Framework如何禁止用户更改用户名?

    我正在创造UserSerializer并希望允许用户创建新帐户但禁止他们更改用户名 有一个read only我可以应用该属性 但用户在创建新用户名时将无法设置用户名 但如果没有它 它允许我改变它 还有一个required不幸的是 该属性不能