DRF:修改模型结构而不修改序列化输出



在我当前的模型中,我有一个JSON字段名为"data",之前的"foo"one_answers";bar"fields在JSON字段中。出于性能原因,我不得不通过django迁移将foo和bar外部化为专用字段。

,但我希望在到达API时保持相同的端点格式。意思是放"食物";和";bar"在类DataSerializer(serializers.Serializer)

如何从FooModelSerializer()共享数据到DataSerializer() ?

端点输出格式:

"results": [
{
"id": 1
"data": {
"json_field_A": "charValue",
"json_field_B": 123,
"json_field_C": "charValue",
"foo": 12,
"bar": "barValue"
},
"other": 12345
},
{
"id": 2
"data": {
"json_field_A": "charValue",
"json_field_B": 123,
"json_field_C": "charValue",
"foo": 12,
"bar": "barValue"
},
"other": 12345
}
]

模型:

class FooModel(models.Model):
data = models.JSONField(
blank=False,
null=False,
default=some_default
)
foo = models.IntegerField()
bar = models.CharField()
other = models.IntegerField()     

序列化器:

class DataSerializer(serializers.Serializer):
json_field_A = fields.CharField()
json_field_B = fields.IntegerField()
json_field_C = fields.CharField()
class FooModelSerializer(serializers.ModelSerializer):
data = DataSerializer()
class Meta:
model = models.FooModel
fields = ['id', 'data', 'other', 'foo', 'bar']

你可以使用ListAPIView来组合这两个序列化器,并编写一个视图来处理它们。

class CombinedListView(ListAPIView):
serializer_class_data = DataSerializer
serializer_class_foo = FooModelSerializer
def get_data(self):
return DataModel.objects.all()

def get_foo(self):
return FooModel.objects.all()
def list(self, request, *args, **kwargs):
data = self.serializer_class_data(self.get_data(), many=True)
foo = self.serializer_class_foo(self.get_foo(), many=True)
return Response({"data": data, "foo": foo})

我建议你使用一些类方法,并在返回响应的主方法中调用它们。

下面是一个类似情况的链接:组合视图

最新更新