覆盖列表序列化程序类中的 to_representation

Posted

技术标签:

【中文标题】覆盖列表序列化程序类中的 to_representation【英文标题】:Override to_representation in List serializer class 【发布时间】:2019-03-20 00:31:24 【问题描述】:

我有一个实现BaseSerializer 类的序列化程序,我在其中使用to_representation 函数来执行这样的函数调用:

class ItemSerializer(serializers.BaseSerializer):
    def to_representation(self, instance):
        ret = super().to_representation(instance)
        ret['log'] = SERVICE.log(instance.id)
        return ret

    class Meta:
        list_serializer_class = ItemListSerializer
        model = models.Item
        fields = '__all__'

我还有一个相同ItemListSerializer 的列表序列化程序,如下所示:

class ItemListSerializer(serializers.ListSerializer):
    def create(self, validated_data):
        items = [models.Item(**item) for item in validated_data]
        return models.Item.objects.bulk_create(items)

当我想要获取整个项目列表时,我想要做的是覆盖 ItemSerializer 中的 to_representation 方法。我基本上想避免对每个项目进行函数调用,而是在出于性能原因请求项目列表时对所有项目进行批量调用。

有什么好办法吗?我按照这些文档创建了ItemListSerializer:https://www.django-rest-framework.org/api-guide/serializers/#customizing-listserializer-behavior,但它只讨论了覆盖创建和更新方法。

【问题讨论】:

列表序列化程序有自己的to_representation 实现。检查它github.com/encode/django-rest-framework/blob/… 【参考方案1】:

您可以访问ListSerializer.to_representation中的所有项目

这应该是一个做你想做的事的好地方。

方法如下:

def to_representation(self, data):
    """
    List of object instances -> List of dicts of primitive datatypes.
    """
    # Dealing with nested relationships, data can be a Manager,
    # so, first get a queryset from the Manager if needed
    iterable = data.all() if isinstance(data, models.Manager) else data

    return [
        self.child.to_representation(item) for item in iterable
    ]

但老实说,我看不出你会从中获得什么。您的用例看起来不会带来可衡量的性能提升。

【讨论】:

这是因为我正在为列表中的每个项目进行 HTTP 调用,我想避免这样做并使用单个调用并获取所有数据。然后我可以在to_representation 中适当地分配数据。这是一个非常小众的案例,但是一旦我实现了它,性能就会大大提高:) @VishalRao 如果您的 SERVICE.log 很耗时(HTTP、数据库查询)并且您希望它在所有对象中重复,这将非常有意义。

以上是关于覆盖列表序列化程序类中的 to_representation的主要内容,如果未能解决你的问题,请参考以下文章

序列化程序中的格式验证错误

如何在其派生类中覆盖列表的切片功能

Java——方法的重写(覆盖)

比较Java方法的重载与覆盖

Java中方法的重载与覆盖(随笔01)

数据类中的默认参数未使用 ktor 序列化程序转换为 json