程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Django rest框架:serializers.ReadOnlyField()在可浏览的api中不显示字段大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Django rest框架:serializers.ReadOnlyField()在可浏览的api中不显示字段?

开发过程中遇到Django rest框架:serializers.ReadOnlyField()在可浏览的api中不显示字段的问题如何解决?下面主要结合日常开发的经验,给出你关于Django rest框架:serializers.ReadOnlyField()在可浏览的api中不显示字段的解决方法建议,希望对你解决Django rest框架:serializers.ReadOnlyField()在可浏览的api中不显示字段有所启发或帮助;

您有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中加入了示例hours_since_join:

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).@R_646_10586@l_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:

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

您需要覆盖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

  • 在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 %}>
    

结果:

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

解决方法

Django rest框架:如何在可浏览的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框架的新手,所以我们将不胜感激!

大佬总结

以上是大佬教程为你收集整理的Django rest框架:serializers.ReadOnlyField()在可浏览的api中不显示字段全部内容,希望文章能够帮你解决Django rest框架:serializers.ReadOnlyField()在可浏览的api中不显示字段所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。