问题描述
我知道使用 source
参数更改序列化程序中表示的文件名相对简单,如下所示:
class SomeSerializer(ModelSerializer):
alternate_name = serializers.someField(source='field_name')
class Meta:
fields = ('alternate_name')
但是在处理多对多字段时,source
是 ManyRelatedManager
并且在其中使用 source
会导致错误:
class SomeModel(models.Model):
field_name = models.ManyToManyField(OtherModel,related_name='groups')
class SomeModelSerializer(ModelSerializer):
alternate_name = models.ListField(source='field_name')
class Meta:
fields = ('alternate_name')
这给 ManyRelatedManager object is not iterable!
使用其他字段而不是 ListField
会导致其他错误。这里的正确方法是什么?
解决方法
如上所述,您可以使用 obj.field_name.filter()
获取相关数据并从 SerializerMethodField()
返回。
我就是这样做的,不确定它是否适合你。
class SomeModel(models.Model):
field_name = models.ManyToManyField(OtherModel,related_name='groups')
class SomeModelSerializer(ModelSerializer):
#name this field whatever you want
some_name = serializers.SerializerMethodField()
# SerializerMethodField gets populated from "get_{filed_name}" method
def get_some_name(self,obj):
#this will return a list
return obj.field_name.filter()
class Meta:
fields = ('some_name')