如何在Django中将列表添加到many = True序列化器

时间:2019-05-07 09:46:40

标签: django django-rest-framework serializer

我有清单[1、2、3] 和TestModel queryset

[ {'pk':1,'text':'one'}, {'pk':2,'text':'two'}, {'pk':3,'text':'three'}]

我有如下的模型和序列化器

class TestMode(models.Model):
    text = models.CharField(max_length=10)

class TestModelSerializer(serializer.ModelSerializer):
    class Meta:
        model = TestModel
        fields = ('pk', 'text')

我想像这样

[{'pk':1, 'text':'one', 'number':1}, {..., 'number':2}, {..., 'number':3}]

我制作了另一个序列化器

class WrapperSerializer(serializer.ModelSerializer):
    number = serializer.IntegerField()
    class Meta:
        model = TestModel
        fields = ('pk', 'text')

我想喜欢以下内容,但我认为这并不酷

serialized_data = TestModelSerializer(qs, many=True).data

for index, data in enumerate(serializerd_data):
    data['number'] = list[index]

serializer = WrapperSerializer(serialized_data, many=True)

我该怎么做???我没有其他主意...请帮助我

1 个答案:

答案 0 :(得分:0)

如果要将计算值(只读)添加到序列化程序,则有两个选择:

  • 在模型上,定义一个@property number

    @property
    def number(self):
        return self.friends.count()  # or whatever you need to calculate the number
    

    然后在序列化程序中,您可以仅将number用作任何其他字段,但需要指定序列化程序的类型(例如IntegerField)。

  • 在串行器上使用here中所述的SerializerMethodField

    number = serializers.SerializerMethodField()
    
    def get_number(self, obj):
        return obj.friends.count()