首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以与主模型相同的方式序列化Django简单历史项目

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

Stack Overflow用户
提问于 2021-07-20 11:12:51
回答 1查看 58关注 0票数 1

我正在尝试使用Django rest框架与Django简单历史相结合。This answer让我了解了如何序列化模型的历史项目。这对于简单的情况很有效,但是我的模型有一个计算字段(下面例子中的“store”)。问题是历史字段的序列化似乎没有捕捉到这些。如何以与主模型相同的方式序列化历史?是否可以在HistoricalRecordFieldto_representation方法中执行此操作

代码语言:javascript
运行
复制
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

我得到的结果类似于:

代码语言:javascript
运行
复制
[
    {
        "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
            }
        ]
    }
]

但我想要的是没有历史列的历史项目,以及没有显示的"store“字段。基本上,我希望历史项目列表被序列化,就像它们是来自主模型的项目一样:

代码语言:javascript
运行
复制
[
    {
        "id": 1,
        "store": {...} ,
        ...
        "history": [
            {
                "store": {...},
                ...
                "id": 1,
            },
            {
                "store": {...},
                ...
                "id": 1,
            }
        ]
    }
]
EN

回答 1

Stack Overflow用户

发布于 2021-07-22 05:10:05

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

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68449146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档