我可以在Rest Framework API浏览视图中禁用某个字段

Tan*_*aho 5 django django-rest-framework

我正在使用Django Rest Framework来序列化我有一个外键的模型.

models.py

class Article(models.Model):
    author = models.ForeignKey(Author, related_name='articles')
    ... other fields...
Run Code Online (Sandbox Code Playgroud)

serializers.py

class ArticleSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Article
Run Code Online (Sandbox Code Playgroud)

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

我已经阅读了如何禁用django-rest-framework的管理式可浏览界面的答案我目前正在JSON中显示视图.但是,我喜欢html视图,并希望找到一种方法来避免底部提供的html表单.

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

任何的想法 ?

Mar*_*obs 6

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

另一个解决方案是覆盖 ,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 ""
Run Code Online (Sandbox Code Playgroud)

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

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'myapp.renderers.NoHTMLFormBrowsableAPIRenderer',
    )
}
Run Code Online (Sandbox Code Playgroud)


Tan*_*aho 4

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

序列化器.py

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