当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Djangorest框架:serializers.ReadOnlyField()不显示可浏览api中的字段》经验,为你挑选了1个好方法。

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

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

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

serializers.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> Radek..:

你有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:

在此输入图像描述

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

您需要覆盖restframework模板.

确保你的模板在restframework之前加载(即你的app在settings.py中的restframework之上)

使用您应用下的模板目录

在模板目录中创建subdir: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中的输入行(添加禁用属性)


结果:

在此输入图像描述

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有