1

我正在尝试将 Django 休息框架与 Django 简单历史结合使用。这个答案让我理解了如何序列化模型的历史项目。这适用于简单的情况,但我的模型有一个计算字段(下例中的“存储”)。问题是历史字段的序列化似乎没有捕捉到这些。如何以与主模型相同的方式对历史进行序列化?to_representation是否可以在方法中做到这一点HistoricalRecordField

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,
            }
        ]
    }
]
4

1 回答 1

0

我找到的解决方案是为历史记录创建一个单独的序列化程序,其作用与主序列化程序相同。然后to_representationHistoricalRecordfield. 请注意,您不能使用主序列化程序 ( 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)
于 2021-07-21T21:10:05.050 回答