You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF序列化ArrayField为字符串报错:to_representation参数数量不符

问题描述

我在模型中定义了一个ArrayField字段,需要将其序列化为字符串并返回查询结果中的前10个标签,但序列化数据时出现错误。编写了如下代码后触发报错:

serializers.py

class StringArrayField(ListField):
    """
    String representation of an array field.
    """
    def to_representation(self, obj):
        obj = super().to_representation(self, obj)
        # convert list to string
        return ",".join([str(element) for element in obj])

    def to_internal_value(self, data):
        data = data.split(",")  # convert string to list
        return super().to_internal_value(self, data)

class TagsSearchSerializer(serializers.ModelSerializer):
    tags = StringArrayField()

    class Meta:
        model = Mymodel
        fields = ('id', 'tags')

models.py

class Mymodel(models.Model):
       tags = ArrayField(models.CharField(max_length=64, blank=True),default=list, blank=True)

views.py

class TagsSearchAPIView(APIView):
"""
Used on dropdown menus to dynamically fetch Tags data
"""

    def get(self, request):
        queryset = Mymodel.objects.all()
        tags = queryset.order_by('tags')[:10]
        serialized_tags = TagsSearchSerializer(tags, many=True, context={'request': 
        request})
        results = serialized_tags.data

        return Response({'results': results})

报错信息

类型错误:to_representation() 只接受1个位置参数,但传入了2个
解决方案

报错原因是调用父类的to_representation和to_internal_value方法时,错误地额外传递了self参数。在Python实例方法中,通过super()调用父类方法时,不需要手动传入当前实例的self,方法会自动绑定实例上下文。

修改serializers.py中的StringArrayField类:

class StringArrayField(ListField):
    """
    String representation of an array field.
    """
    def to_representation(self, obj):
        # 移除多余的self参数
        obj = super().to_representation(obj)
        # convert list to string
        return ",".join([str(element) for element in obj])

    def to_internal_value(self, data):
        data = data.split(",")  # convert string to list
        # 移除多余的self参数
        return super().to_internal_value(data)

修改后,序列化时即可正确将ArrayField转换为逗号分隔的字符串,同时也能将传入的字符串拆分为列表。

内容的提问来源于stack exchange,提问作者jimmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:20:45