我可以禁用 Rest Framework API 浏览视图中的字段吗

Posted

技术标签:

【中文标题】我可以禁用 Rest Framework API 浏览视图中的字段吗【英文标题】:Can I disable a field in the Rest Framework API browsing view 【发布时间】:2014-05-28 13:45:59 【问题描述】:

我正在使用 Django Rest Framework 序列化一个模型,其中我有一个外键。

models.py

class Article(models.Model):
    author = models.ForeignKey(Author, related_name='articles')
    ... other fields...

serializers.py

class ArticleSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Article

我想摆脱可浏览 API 视图底部的“html 表单”,因为我得到了一个包含我所有文章的列表并从数据库中检索它们需要很长时间(我有大约 10 万篇文章,每次html 表单显示,我的服务器执行 100K 查询)。

我已阅读来自How to disable admin-style browsable interface of django-rest-framework? 的答案,我目前正在以 JSON 格式显示视图。但是,我喜欢 html 视图,并想找到一种方法来避免底部可用的 html 表单。

我不想从视图中正确删除该字段(我需要使用它),而只是删除用于填充表单的数据库查询。

有什么想法吗?

【问题讨论】:

【参考方案1】:

@maerteijn answer 将禁用所有表单:POST、PUT、DELETE 和 OPTIONS。

如果您仍然想允许令人敬畏的“OPTIONS”按钮,您可以这样做

class NoHTMLFormBrowsableAPIRenderer(BrowsableAPIRenderer):
    OPTIONS_METHOD = "OPTIONS"

    def get_rendered_html_form(self, data, view, method, request):
        if method == self.OPTIONS_METHOD:
            return super().get_rendered_html_form(data, view, method, request)
        else:
            """
            We don't want the HTML forms to be rendered because it can be
            really slow with large datasets
            """
            return ""

并以同样的方式修改settings.py

REST_FRAMEWORK = 
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'myapp.renderers.NoHTMLFormBrowsableAPIRenderer',
    )

【讨论】:

【参考方案2】:

将字段设置为只读也意味着您不能修改它,这可能不是所有情况下都需要的。

另一种解决方案是覆盖BrowsableApiRenderer,这样它就不会显示 HTML 表单(如果有大量数据,这确实会很慢)。

这非常简单,只需覆盖get_rendered_html_form

from rest_framework.renderers import BrowsableAPIRenderer


class NoHTMLFormBrowsableAPIRenderer(BrowsableAPIRenderer):

    def get_rendered_html_form(self, *args, **kwargs):
        """
        We don't want the HTML forms to be rendered because it can be
        really slow with large datasets
        """
        return ""

然后调整您的设置以使用此渲染器:

REST_FRAMEWORK = 
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'myapp.renderers.NoHTMLFormBrowsableAPIRenderer',
    )

【讨论】:

【参考方案3】:

我回答我自己的问题。 我在documentation 中找到了我的问题的解决方案。我必须使用 read_only 属性。

serializers.py

class ArticleSerializer(serializers.HyperlinkedModelSerializer):
    author = serializers.RelatedField(read_only=True)
    class Meta:
        model = Article
        fields = ('author', ...other_fields)

【讨论】:

您还可以在元类中定义您的只读字段(参见docs)

以上是关于我可以禁用 Rest Framework API 浏览视图中的字段吗的主要内容,如果未能解决你的问题,请参考以下文章

django-rest-framework - 在可浏览的 API 中自动生成表单?

06-REST Framework - API

禁用 WP REST API 的默认路由

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

JSON:带有 django-rest-framework-json-api 和 JWT 的 API

如何为 django-rest-framework api 编写单元测试?