django - 覆盖列表序列化程序类中的 to_representation
问题描述
我有一个序列化程序,它实现了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)
当我想要获取整个项目列表时,我想要做的是覆盖forto_representation
中的方法。ItemSerializer
我基本上想避免对每个项目进行函数调用,而是在出于性能原因请求项目列表时对所有项目进行批量调用。
有没有好的方法来做到这一点?我遵循这些文档来创建ItemListSerializer
:https://www.django-rest-framework.org/api-guide/serializers/#customizing-listserializer-behavior但它只讨论了覆盖创建和更新方法。
解决方案
您可以访问所有项目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
]
但老实说,我看不出你会从中得到什么。您的用例看起来不会带来可衡量的性能提升。
推荐阅读
- php - Vuejs2 - 如何使用 $(this).val()
- uwp - Windows ML - ONNX - HRESULT 异常:0x88900105
- java - Java JNA - 检测注册表值何时更改
- python - 没有scapy模块的python dns嗅探器
- android - FusedLocationProvider 返回 null
- asp.net-core - Visual Studio 2017 显示 Blazor 错误但编译
- php - 克隆 Laravel 项目并安装 composer 和 npm 然后也给我错误 500 page not found
- pyspark - Apache Zeppelin Spark java.lang.NoSuchMethodError: io/netty/buffer/PooledByteBufAllocator.metric()Lio/netty/buffer/PooledByteBufAllocatorMetric;
- excel - 使用样式将 TypeScript 导出到 Excel
- angularjs - angularJS 过滤器和 $http