gpt4 book ai didi

python - Django rest framework : serializers. ReadOnlyField() 不在可浏览的 api 中显示字段

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:17 25 4
gpt4 key购买 nike

Django rest 框架:如何在可浏览的 api 中显示只读字段?

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

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

的 api.html 模板中

序列化器.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 框架的新手,所以任何帮助将不胜感激!

最佳答案

你有两个选择:

  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

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

serializers.py 中的示例 hours_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 中显示添加的字段

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

如您所见,全名和自加入以来的小时数未呈现在表单中,但可用于 API:

enter image description here

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

您需要覆盖 restframework 模板。

  • 确保您的模板在 restframework 之前加载(即您的应用在 settings.py 中的 restframework 之上)
  • 使用您应用下的模板目录
  • 在模板目录中创建子目录: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

关于python - Django rest framework : serializers. ReadOnlyField() 不在可浏览的 api 中显示字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34527669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com