首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django rest框架: serializers.ReadOnlyField()不在browsable api中显示字段

Django rest框架: serializers.ReadOnlyField()不在browsable api中显示字段
EN

Stack Overflow用户
提问于 2015-12-30 18:29:19
回答 2查看 10.8K关注 0票数 4

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

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

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

serializers.py

代码语言:javascript
复制
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框架的新手,所以如果有任何帮助,我将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-30 18:59:14

您有两个选项:

序列化以在

  1. 中计算结果,或在序列化

中添加字段

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

当您想要在模型中计算结果时

以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这是一个只读的field...It,可用于将任何类型的数据添加到对象的序列化表示中。

Serializers.py中的示例hours_since_joined:

代码语言:javascript
复制
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')

对于您的案例:

代码语言:javascript
复制
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:

如果还想在表单上显示只读字段,则为

您需要覆盖restframework模板。

确保在加载create框架之前加载模板(即,您的应用程序位于settings.py)

  • use中的create框架之上您的应用程序目录下的templates目录,并在模板目录中创建子目录: restframework/horizontal

  • copy

form.html

  • input.html from Python's Lib\site-packages\rest_framework\templates\rest_framework\horizontal\

  • change form.html

表单%}中字段的字段{% load rest_framework %} {% render_field

style=style %} {% Endfor%}

  • 更改input.html中的输入行(添加禁用属性)

结果是:

票数 11
EN

Stack Overflow用户

发布于 2020-10-26 21:15:35

对于无法使其在Browsable API中可见的用户,应将模板文件夹命名为:rest_framework

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34527669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档