覆盖 List 序列化器类中的 to_representation

Vis*_*Rao 3 django django-views python-3.x django-serializer django-rest-framework

我有一个序列化程序,它实现了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__'
Run Code Online (Sandbox Code Playgroud)

我也有一个类似的列表序列化器,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)
Run Code Online (Sandbox Code Playgroud)

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

有没有好的方法可以做到这一点?我按照这些文档创建了ItemListSerializerhttps : //www.django-rest-framework.org/api-guide/serializers/#customizing-listserializer-behavior但它只讨论了覆盖创建和更新方法。

Kam*_*ski 5

您可以访问中的所有项目 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
    ]
Run Code Online (Sandbox Code Playgroud)

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

  • 这是因为我正在对列表中的每个项目进行 HTTP 调用,并且我想避免这样做并使用单个调用来获取所有数据。然后我可以在“to_representation”中适当地分配数据。这是一个非常小众的案例,但一旦我实现了这个,性能就提高了很多:) (2认同)