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
相关产品推荐
相关产品推荐

