首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django Rest Framework中有没有一种只提供特定属性的方法?

在Django Rest Framework中有没有一种只提供特定属性的方法?
EN

Stack Overflow用户
提问于 2021-01-04 22:38:44
回答 1查看 34关注 0票数 0

在构建大型web后端时,我们面临着一个问题,即我们的模型具有很多属性。由于我们希望减少响应的大小以提高效率,因此我们对模型使用了不同的序列化程序。以这个简单的模型为例:

代码语言:javascript
运行
复制
class Address(models.Model):
    country_id = models.ForeignKey(Country, on_delete=models.PROTECT)
    postal_code = models.CharField(max_length=10)
    street = models.CharField(max_length=176)
    number = models.CharField(max_length=20)
    additional = models.CharField(max_length=256, blank=True, default='')
    city = models.CharField(max_length=176)
    state = models.CharField(max_length=50)

    user = models.ForeignKey('user.User', on_delete=models.CASCADE)

仅此一项,我们就有一个ID序列化程序、一个StringSerializer (用于传递可用的字符串)、一个MinimalSerializer (用于多个地址的列表)、一个DetailSerializer (带有用于获取国家和用户详细信息的depth=1……

现在,由于这种复杂性,我们面临着几个问题,并考虑重新构建api,以便在请求中包含必需的字段。使用django + drf可以做到这一点吗?我们相信在Content Negotiation下找到了一些东西,但这是一个不同的主题。

EN

回答 1

Stack Overflow用户

发布于 2021-01-04 23:42:37

您可以像这样动态修改字段:

代码语言:javascript
运行
复制
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed.
    """

    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop('fields', None)

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

        if fields is not None:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)

欲了解更多信息,请访问drf docs

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65564518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档