以与主模型相同的方式序列化Django简单历史项



我正在尝试将Django rest框架与Django简单历史结合使用。这个答案让我明白了了解如何序列化模型的历史项。这在简单的情况下效果很好,但我的模型有一个计算字段(下面的例子中的"store"(。问题是历史字段的序列化似乎没有捕捉到这些。如何以与主模型相同的方式序列化历史?在HistoricalRecordFieldto_representation方法中可以做到这一点吗?

class MyModel(models.Model):
...
history = HistoricalRecords()
@property
def store(self):
return {}

class HistoricalRecordField(serializers.ListField):
child = serializers.DictField()
def to_representation(self, data):
return super().to_representation(data.values())

class MySerializer(serializers.ModelSerializer):
...
store = serializers.DictField(child=serializers.CharField(), read_only=True)
history = HistoricalRecordField(read_only=True)

class Meta:
model = MyModel

我得到的是:

[
{
"id": 1,
"store": {} 
"history": [
{
"history_id": 1,
"id": 1,
"history_date": "2016-11-22T08:02:08.739134Z",
"history_type": "+",
"history_user": 1
},
{
"history_id": 2,
"id": 1,
"history_date": "2016-11-22T08:03:50.845634Z",
"history_type": "~",
"history_user": 1
}
]
}
]

但我想要的是没有历史栏并且带有";存储";没有显示的字段。基本上,我希望历史项目的列表被序列化,就像它们是来自主模型的项目一样:

[
{
"id": 1,
"store": {...} ,
...
"history": [
{
"store": {...},
...
"id": 1,
},
{
"store": {...},
...
"id": 1,
}
]
}
]

我找到的解决方案是为历史记录创建一个单独的序列化程序,该序列化程序的操作方式与主序列化程序相同。然后在HistoricalRecordfieldto_representation方法中使用该序列化程序。请注意,不能使用主序列化程序(MySerializer(,因为它会创建递归。

class HistoricalSerializer(serializers.ModelSerializer):
...
store = serializers.DictField(child=serializers.CharField(), read_only=True)
class Meta:
model = MyModel
class HistoricalRecordField(serializers.ListField):
child = serializers.DictField()
def to_representation(self, data):
dvs = HistoricalRecordSerializer(data, many=True).data
return super().to_representation(dvs)

最新更新