当前位置: 首页 > 知识库问答 >
问题:

Django Rest框架:动态返回字段子集

方玄天
2023-03-14

正如blogpost关于设计实用的RESTful API的最佳实践中所推荐的,我想在基于Django Rest框架的API中添加一个fields查询参数,该参数允许用户仅选择每个资源的字段子集。

序列化程序:

class IdentitySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Identity
        fields = ('id', 'url', 'type', 'data')

常规查询将返回所有字段。

获取/identities/

[
  {
    "id": 1,
    "url": "http://localhost:8000/api/identities/1/",
    "type": 5,
    "data": "John Doe"
  },
  ...
]

具有fields参数的查询应仅返回字段的子集:

获取/identities/?fields=id,data

[
  {
    "id": 1,
    "data": "John Doe"
  },
  ...
]

包含无效字段的查询应忽略无效字段或引发客户端错误。

这是不是可能的?如果没有,实现这一点最简单的方法是什么?是否有一个第三方包已经做到这一点?

共有1个答案

许茂才
2023-03-14

您可以重写序列化程序__init__方法,并根据查询参数动态设置fields属性。您可以在整个上下文中访问request对象,并将其传递给序列化程序。

下面是一个来自Django Rest框架文档示例的copy&paste:

from rest_framework import serializers

class DynamicFieldsModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed.
    """

    def __init__(self, *args, **kwargs):
        # Instantiate the superclass normally
        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)

        fields = self.context['request'].query_params.get('fields')
        if fields:
            fields = fields.split(',')
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields.keys())
            for field_name in existing - allowed:
                self.fields.pop(field_name)


class UserSerializer(DynamicFieldsModelSerializer, serializers.HyperlinkedModelSerializer):

    class Meta:
        model = User
        fields = ('url', 'username', 'email')
 类似资料:
  • 问题内容: 我想向fields基于Django Rest Framework的API 添加查询参数,该参数使用户只能为每个资源选择字段的子集。 例 序列化器: 常规查询将返回所有字段。 具有参数的查询应仅返回字段的子集: 具有无效字段的查询应忽略无效字段或引发客户端错误。 目标 这是否可能开箱即用?如果没有,最简单的实现方法是什么?周围是否有第三方包装? 问题答案: 你可以覆盖序列化方法,并根据查

  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 任何人都可以帮助我查询mongo以释放数组,我使用的是mongdb本机驱动程序我的收集文档如下,也请忽略我的objectId它只是示例 而我的预期产出是 我只想解开我的数组,在一个查询中的爱好描述之间添加一个逗号,谢谢你的帮助

  • 我在Spring MVC(4.1.1)中使用了Thymeleaf(Tymeleaf-Spring4-2.1.3),并有一个模型/命令对象,如下所示: Thymeleaf如何确定必须生成隐藏字段? 即使我将属性更改为 这里相同:没有隐藏字段。

  • 我不得不承认,随着iOS8的发布,我对iOS中的动态和静态框架有点困惑。 我正在寻找一种方法来分发我创建的库,我需要支持iOS7和更高版本。(注意:这将是一个专有的框架。我不能使用可可荚,我也不能分发源代码)。下面是我已经知道的: iOS 8为iOS引入了“嵌入式框架”,但据我所知,它们不适用于iOS 7,仅适用于iOS 8及以上版本。 我可以选择将我的库作为静态库(.a文件)分发,还可以分发头。

  • 我遇到了这样的错误: 回溯: 文件“/usr/local/lib/python2.7/dist packages/django/core/handlers/exception.py”,位于内部41。响应=获取响应(请求) 文件“/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py”,位于_-get_-response