允许 Django Rest Framework 序列化器字段名称中使用连字符

2024-03-31

鉴于我正在编写代码的 OpenAPI 规范需要在请求正文中使用连字符大小写(又名短横线大小写)变量名称,那么在使用 Django Rest Framework 时应如何处理?

例如,一个请求POST /thing创建一个具有以下主体的事物:

{
    "owner-type": "platform"
}

但在Python中,owner-type不是有效的变量名称(“SyntaxError:无法分配给运算符”),因此Thing has owner_type在模型定义中:

class Thing(models.Model):
    owner_type = models.CharField(max_length=8)

但现在ThingSerializer是有问题的,因为,再一次,owner-type是非法名称。这是不允许的:

    owner-type = serializers.CharField(...)

我试图覆盖名称的生成方式ModelSerializer通过尝试调整生成的字段名称get_fields(),但失败了。这是我的序列化器:

class ThingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Thing
        fields = [
            'owner_type',
        ]

    def get_fields(self):
        fields = super().get_fields()
        out_fields = OrderedDict()
        for field_name, field in fields.items():
            out_fields[field_name.replace('_', '-')] = field
        return out_fields

和错误:

../venv/lib/python3.6/site-packages/rest_framework/fields.py:453: in get_attribute
    return get_attribute(instance, self.source_attrs)
../venv/lib/python3.6/site-packages/rest_framework/fields.py:101: in get_attribute
    instance = getattr(instance, attr)
E   AttributeError: 'Thing' object has no attribute 'owner-type'

所以我的问题是 - 如何配置 DRF 模型序列化器以允许对包含下划线的模型字段进行序列化/反序列化,以便 API 客户端看到连字符而不是下划线?这将是上面示例的通用解决方案,其中Thing.owner_type应该通过传递字段来读取/写入"owner-type"在 JSON 正文中。

我在 Python 3.6 上使用最新的 Django 和 DRF。

编辑 1:澄清理想情况下这将是一个将下划线转换为连字符的通用解决方案。


您可以使用连字符定义字段名称fields并通过定义将其映射到正确的 django 模型字段source属性在extra_kwargs - see https://www.django-rest-framework.org/api-guide/serializers/#additional-keyword-arguments https://www.django-rest-framework.org/api-guide/serializers/#additional-keyword-arguments

回答你定义的问题ThingSerializer如下:

class ThingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Thing
        fields = [
            'owner-type',
        ]
        extra_kwargs = {
            'owner-type': {'source': 'owner_type'},
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

允许 Django Rest Framework 序列化器字段名称中使用连字符 的相关文章

随机推荐

  • 使用 Web 部署发布 ASP.NET MVC2 站点

    我目前使用 Web 部署 http learn iis net page aspx 346 web deploy http learn iis net page aspx 346 web deploy 发布我的 MVC2 应用程序 它曾经工
  • file_get_contents() 修改后的 HTTP 标头返回垃圾 html 输出

    以下代码用于使用 PHP 的 SIMPLETHTMLDOM 解析器提取 html include simple html dom php context stream context create array http gt array m
  • 在SAX解析期间确定根元素

    我正在使用 SAX 来解析 XML 文件 假设我希望我的应用程序only处理带有根元素 animalList 的 XML 文件 如果根节点是其他节点 SAX 解析器应该终止解析 使用 DOM 你可以这样做 Element rootEleme
  • 在 Flutter 中使用 After Effects 文件

    我知道如何导出Rive在 Flutter 应用程序中使用的 Flare 文件 但我怎样才能import Adobe 后遗症文件到 Rive 我知道可以这样做Lottie但我无法弄清楚如何准确地做到这一点 您可以轻松导入 bodymovin
  • 如何使用 Jest 和 vue/test-utils 测试输入文件

    我想使用 Jest 和 vue test utils 测试文件上传器组件 我有这个 describe show progress bar of uploading file gt const wrapper mount FileUpload
  • 如何在 lldb 中创建和使用临时 NSRange?

    NSRange 只是一个 C 结构体 我想在 Xcode 的 lldb 中的断点处创建一个临时的 专门用于 NSArray 方法objectAtIndex inRange 这是行不通的 lldb expr NSRange tmpRange
  • 高效更新 Bokeh 中的图像图以实现交互式可视化

    我正在尝试使用 Bokeh 创建多维数组的不同切片的平滑交互式可视化 切片中的数据根据 用户交互而变化 因此每秒必须更新几次 我编写了一个 Bokeh 应用程序 其中包含几个小图像图 64x64 值 来显示切片的内容 以及在用户与应用程序交
  • 根据年份合并 data.frames 并填写缺失值

    我有两个 data frames 我想将它们合并在一起 第一个是 datess lt seq as Date 2005 01 01 as Date 2009 12 31 days sample lt data frame matrix nc
  • JavaFX:如何在不关注主窗口的情况下关闭子窗口

    我试图在一定时间后以编程方式关闭子窗口 这个子窗口的initOwner是与主舞台一起设置的 但是关闭这个子窗口后 主窗口就会获得焦点 有什么方法可以在不关注主窗口的情况下关闭子窗口 以编程方式 下面是我的问题的快速演示 我尝试了所有可能的方
  • OSX 上“没有名为 _scproxy 的模块”

    我使用的是预装 python 2 6 的 OSX 10 6 并且想通过 easy install 或 setup py 在下载的包中 安装 python 包 就我而言 我正在尝试安装 MySQLdb 在这两种情况下 我都会得到一个堆栈跟踪
  • 在处理其他事情时如何将一堆未提交的更改放在一边

    如果我有一堆未提交的更改 并且想在处理其他事情时将其放在一边 然后稍后 例如几天后 返回并继续工作 完成此任务最简单的工作流程是什么 到目前为止我只体验过 Mercurial 的基本功能 我通常的方法是使用克隆创建一个新分支 但可能有更好的
  • 自动布局问题 Xcode 8 [_SwiftValue nsli_superitem]

    将我的代码转换为 Swift 3 我发现了一个奇怪的问题 现在 2016 年 9 月 15 日 Xcode 8 公共版本 已经发布 转换代码后 我的应用程序崩溃了 没有明显的原因 自动布局有问题 日志显示如下 SwiftValue nsli
  • Android,在库项目中提供应用程序特定常量的最佳方式?

    我正在为许多 Android 应用程序创建一个库项目 这些应用程序都具有一些我希望包含在库项目中的通用功能 但库项目功能需要使用特定于应用程序的常量 所以我正在寻找一种方法来为库函数提供常量名称并允许每个应用程序定义它们 特定应用程序常量的
  • data.table 中的 Between 与 inrange

    In R s data table 什么时候应该选择 between and inrange 用于子集化操作 我已阅读帮助页面 between我仍然对这些差异感到摸不着头脑 library data table X data table a
  • 屏幕阅读器何时应该可以使用“隐藏”元素(为了可访问性,a11y)?

    我听到建议 hidden类不作为 hidden display none 但将其宽度和高度设置为 1 并使用剪切等 使元素看起来仍然存在于屏幕上 但内容不可见 但是 当我们使用 JavaScript 隐藏某些内容时 该元素的目的就已经完成
  • 查找 JUnit TestCase 中测试方法的数量

    有没有办法知道测试用例中测试方法的数量 我想做的是有一个测试用例来测试几种场景 对于所有这些我只会执行一次 data setUp 同样 我想在所有测试方法结束时进行一次清理 tearDown 我当前使用的方法是维护一个计数器来记录文件中存在
  • Angular 2 - 如何在组件中包含 javascript?

    我对 Angular 完全陌生 直接开始使用 Angular 2 Angular 的一大优点是我可以模块化网页的每个功能 组件有自己的 html 和样式表 但是他们自己的 javascript 文件呢 我怎样才能包含它自己的特定 javas
  • 使用 powershell 获取家庭网络上的设备名称及其 IP 地址

    这个问题是由于尝试管理我的家庭 WiFi 网络而产生的 我一直在尝试 get netipaddress ipconfig 和 nslookup exe 等命令 以下命令有点引导我到某个地方 但它没有我正在寻找的信息 Get NetIPAdd
  • Zend_Form_Element_MultiCheckbox:如何将一长串复选框显示为列?

    所以我正在使用Zend Form Element MultiCheckbox显示一长串复选框 如果我简单地echo元素 我得到很多由分隔的复选框 br 标签 我想找出一种方法来利用简单性Zend Form Element MultiChec
  • 允许 Django Rest Framework 序列化器字段名称中使用连字符

    鉴于我正在编写代码的 OpenAPI 规范需要在请求正文中使用连字符大小写 又名短横线大小写 变量名称 那么在使用 Django Rest Framework 时应如何处理 例如 一个请求POST thing创建一个具有以下主体的事物 ow