【问题标题】:Deserializing json to a python object without actually save the object in DB将 json 反序列化为 python 对象而不实际将对象保存在 DB 中
【发布时间】:2022-06-11 11:35:02
【问题描述】:

我使用Django 和模型类来访问来自DB 的数据。我想在DB之上添加缓存层。

例如,假设我有一个 User 模型和 UserSerializer(继承自 ModelSerializer)。 在缓存中存储用户对象时,我需要将serialize对象转为json

import json
serializer = UserSerializer(obj)
serialized_data = json.dumps(serializer.data)

但是,当我从缓存中检索此 json 时,我无法将其转换回用户对象

data = json.loads(serialized_data)
deserializer = UserSerializer(data=data)
user_obj = deserializer.save() # this return an User object but intenally it will create a new record in DB

我可以使用 django 提供的 serializer 将 json 反序列化为对象而不实际在 DB 中创建记录有什么更好的想法吗?

【问题讨论】:

    标签: python json django serialization django-rest-framework


    【解决方案1】:

    您可以只使用模型创建带有serializer.validated_data 的对象,而无需实际将其保存到数据库中:

    serializer = UserSerializer(data=data)
    serializer.is_valid(raise_exception=True)
    user_obj = User(**serializer.validated_data)
    

    但是,重要的是要注意,如果您的模型有任何关系并且序列化程序将它们作为字段接受,则您必须手动处理 ManyToMany 关系。

    如果您有 ManyToManyField 并且不想手动处理它,您也可以在 atomic transaction 中调用 deserializer.save() 并在之后立即引发异常,这将创建 user_obj 变量而没有任何正在提交到数据库的更改:

    from django.db import transaction, NotSupportedError
    
    serializer = UserSerializer(data=data)
    serializer.is_valid(raise_exception=True)
    try:
        with transaction.atomic():
            user_obj = serializer.save()
            raise NotSupportedError
    except NotSupportedError:
        pass
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      相关资源
      最近更新 更多