Django Rest 框架:serializers.ReadOnlyField() 不显示可浏览 api 中的字段

2023-11-24

Django Rest Framework:如何在可浏览的 api 中显示只读字段?

当我添加result = serializers.CharField(read_only=True)对于我的模型序列化器,表单不再呈现结果字段。

我了解用户删除disabled表单输入上的属性(尽管我很惊讶 django 本身没有处理这个问题),那么我如何在 api.html 模板中实现只读字段result?

序列化器.py

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
result = serializers.CharField(read_only=True)

class Meta:
    model = Snippet
    fields = ('title', 'code', 'owner', 'url', 'result')

我是 django-rest 框架的新手,所以任何帮助将不胜感激!


您有 2 个选择:

  1. 要么计算模型中的结果

  2. 或在序列化中添加字段

您的选择取决于您是否想在其他地方使用该计算结果以及您是否可以触摸模型。

当你想计算模型中的结果时

遵循 Django 派生全名的示例,位于以下位置:https://github.com/django/django/blob/master/django/contrib/auth/models.py#L348

或者在文档中解释:https://docs.djangoproject.com/en/dev/topics/db/models/#model-methods

这将自动充当 DRF 的只读字段。

您可以在下面的代码中看到用法(get_full_name)。

当您想在序列化中添加字段时

您可以在 DRF 文档中找到答案:http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

序列化方法字段这是一个只读字段...它可用于将任何类型的数据添加到对象的序列化表示中。

Serializers.py 中的 hour_since_joined 示例:

from django.contrib.auth.models import User, Group
from rest_framework import serializers
from django.utils.timezone import now

class UserSerializer(serializers.HyperlinkedModelSerializer):
    hours_since_joined = serializers.SerializerMethodField()
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups', 'hours_since_joined', 'first_name', 'last_name', 'get_full_name' )

    def get_hours_since_joined(self, obj):
        return (now() - obj.date_joined).total_seconds() // 3600

class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name', 'user_set')

对于你的情况:

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    result = serializers.SerializerMethodField()

    class Meta:
        model = Snippet
        fields = ('title', 'code', 'owner', 'url', 'result')

    def get_result(self, obj):
        # code here to calculate the result
        # or return obj.calc_result() if you have that calculation in the model
        return "some result"

显示 DRF 可浏览 API 中添加的字段

您需要在元字段中列出它们 - 请参阅上面的示例。这将在请求的可浏览输出中呈现该内容。但是,它不会在 DRF 的 HTML 表单中显示它们。原因是HTML表单仅用于提交信息,因此restframework模板在渲染时跳过了只读字段。

正如您所看到的,加入后的全名和小时数并未呈现在表单中,但可用于 API:

enter image description here

如果您想在表单上也显示只读字段

您需要覆盖restframework模板。

  • 确保您的模板在其余框架之前加载(如果您的应用程序位于 settings.py 中的其余框架之上)
  • 使用应用程序下的模板目录
  • 在模板目录中创建子目录:restframework/horizo​​ntal
  • 从Python的Lib\site-packages\rest_framework\templates\rest_framework\horizo​​ntal\复制form.html和input.html

  • 更改form.html

{% load rest_framework %}
{% for field in form %}
    {% render_field field style=style %}
{% endfor %}
  • 更改 input.html 中的输入行(添加禁用属性)

    <input name="{{ field.name }}"  {% if field.read_only %}disabled{% endif %} {% if style.input_type != "file" %}class="form-control"{% endif %} type="{{ style.input_type }}" {% if style.placeholder %}placeholder="{{ style.placeholder }}"{% endif %} {% if field.value %}value="{{ field.value }}"{% endif %}>
    

结果:

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Rest 框架:serializers.ReadOnlyField() 不显示可浏览 api 中的字段 的相关文章

随机推荐

  • 图像上缩进的透明箭头/三角形

    我想做一个图像上的透明箭头 该三角形应在半透明块中缩进并显示背景图像 期望的输出 barShow background color 000 opacity 0 5 barShow before top 0 left 50 border so
  • 如何在 Markdown 中的文本上应用颜色

    我想使用 Markdown 来存储文本信息 但快速谷歌搜索显示 Markdown 不支持颜色 另外 Stack Overflow 不支持颜色 与 GitHub markdown 的情况相同 有没有允许彩色文本的 Markdown 风格 TL
  • TypeError:只有长度为 1 的数组可以使用 NUMPY 转换为 Python 标量

    coding utf 8 import matplotlib pyplot as plt import numpy as np import math task 2e x np linspace 0 0001 0 1 50 constant
  • .rpt设计时如何使水晶报表页面宽度变大

    我正在寻找一种调整页面宽度大小的方法 Crystal Reports 使我可以将字段放置在 rpt 文件中 到目前为止 我发现如果右键单击报告 选择 设计 打印机设置 我可以选择要打印报告的纸张尺寸 如果我选择 方向 横向 我可以增加页面的
  • 使用 prism.js 突出显示 html

    我似乎无法使用 prism js 突出显示 html 因为它删除了仅打印文本的标记 pre 标签内的以下代码仅显示为文本 我将 代码 标签的类设置为 语言标记 table class data table tr td Title td td
  • 将 foreach 与 LINQ to Entities 结合使用时是否需要 ToList

    我有一个关于 LINQ 如何与foreach通过实体框架中的可查询实体 做哪一个更好 更快 foreach var thing in myentities GetThemAll or foreach var thing in myentit
  • 重定向根 URL - IIS 7

    我的网站上安装了一些论坛http ironnoob com forums 我的网站位于 c IronNoob 我的论坛安装在 c IronNoob forums 我希望 ironnoob com 和 www ironnoob com 都进行
  • 如何在docker容器中伪造cpu架构?

    当我创建 32 位 CentOS 5 docker 映像时 我希望 cpu 架构报告为 i386 i686 安装程序在此容器检查架构中进行测试并安装 64 位二进制文 件而不是 32 位 我设置了 yum 变量并创建了 uname 包装器
  • 批处理文件中删除特定扩展名的文件

    我想递归删除批处理文件中具有特定扩展名的所有文件 我知道以下命令 del s ext 但是 这在 Windows 上也会删除具有其他扩展名的文件 例如 ext1 或 ext2 其原因似乎是此类文件的 8 3 文件名以 ext 结尾 因此扩展
  • 实体框架 EF.Functions.Like 与 string.Contains

    我正在阅读实体框架核心2 0的公告https blogs msdn microsoft com dotnet 2017 08 14 announcing entity framework core 2 0 它说他们添加了新的 Sql 函数
  • 下拉 onchange 调用 PHP 函数

    我尝试使用下面的代码从下拉菜单中调用 PHP 函数 有没有一种干净的方法可以做到这一点 code section section
  • AngularJs 单元测试 - 嘲笑承诺不执行“然后”

    我们正在对控制器进行单元测试 我们已经成功模拟了对 REST 服务层的调用 并验证了它确实是使用给定的数据进行调用的 然而现在我们想在我们的控制器中测试then承诺改变location path 控制器 function app contr
  • Python字典迭代器性能

    在 Python 中使用字典时 这一页表示迭代字典元素的时间复杂度是O n where n是字典的最大尺寸 但是 我认为没有一种明显的方法可以迭代哈希表的元素 我可以假设性能良好吗dict iteritems 当迭代哈希表的元素时 没有太多
  • Alamofire POST 请求有进度

    我正在使用 Alamofire 执行 POST 请求 由于此 POST 请求可能需要一段时间 并且我想跟踪进度并将其显示为 ProgressView Alamofire request POST ApiLink create post pa
  • 在一台几乎相同的机器上获取“ld:未找到架构 x86_64 clang 的符号”

    我已经研究了两天 搜索了互联网的各个角落 但找不到任何解决方案 目前 当我尝试在 M1 Max 上构建 React Native Xcode 项目时 我得到ld symbol s not found for architecture x86
  • git中的文件和目录被修改后如何恢复权限?

    我有一个 git 结帐 所有文件权限都与 git 认为应有的权限不同 因此它们都显示为已修改 在不触及文件内容的情况下 只想修改权限 如何将所有文件权限设置为 git 认为应该的权限 Git 会跟踪文件权限并在使用创建补丁时公开权限更改gi
  • 是否有相当于 Stata 的 egen 函数? [复制]

    这个问题在这里已经有答案了 Stata 有一个非常好的命令 egen 这使得计算观察组的统计数据变得容易 例如 可以计算每个组的最大值 平均值和最小值 并将它们作为变量添加到详细数据集中 Stata 命令是一行代码 by group ege
  • 两个短整数的异或

    我正在计算XOR of two short integers using XOR 操作员以传统方式 下面是方法 short a 197 short b 341 short y short a b 然而 异或总是返回整数 但在我的例子中 输入
  • 参数化 DllImport 以在 C# 应用程序中使用

    我们有一家供应商提供了一个库来访问他们的硬件 不幸的是 如果您有多个设备 则需要使用不同的 dll 名称多次导入它们的库 因此 我们有大量的重复代码 我担心它很快就会成为维护的噩梦 我们现在拥有的是这样的 namespace MyNames
  • Django Rest 框架:serializers.ReadOnlyField() 不显示可浏览 api 中的字段

    Django Rest Framework 如何在可浏览的 api 中显示只读字段 当我添加result serializers CharField read only True 对于我的模型序列化器 表单不再呈现结果字段 我了解用户删除d