【问题标题】:Can I disable a field in the Rest Framework API browsing view我可以禁用 Rest Framework API 浏览视图中的字段吗
【发布时间】:2025-11-26 07:20:07
【问题描述】:

我正在使用 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 表单。

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

有什么想法吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案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
        最近更新 更多