【问题标题】:Do data conversion after Django model object is fetched获取Django模型对象后进行数据转换
【发布时间】:2021-06-04 04:32:26
【问题描述】:

我想将 Django 模型中的 Python 字典保存为 JSON,并且我想在获取该数据时将该 JSON 转换回 Python 字典。

我知道我可以在视图内完成,但我想在模型中实现它,以便在查询时返回字典对象。

是否有任何信号或任何 post_fetch 方法可以用来实现它,我在谷歌上找不到任何东西......

【问题讨论】:

  • 在 Django 版本 >=3.1 中,您可以简单地使用 JSONField。在低于此的版本中,如果您使用 PostgreSQL,则可以使用它的 JSONField。

标签: django django-models model


【解决方案1】:

您可能想简单地使用 Python JSON 包,除非您使用 Postgres 作为数据库 - 在这种情况下,JSONField 是要走的路。 json 包是explained here,如果我明白你在说什么,你可以在这样的模型中使用它:

import json

class MyModel(models.Model):
    json_field = models.TextField() # or you can use JSONField if using Postgres

    @property
    def get_json_field_as_dictionary(self):
       return json.loads(self.json_field)

   def set_json_field(self, mydict):
       self.json_field = json.dumps(mydict)

    @classmethod
    def get_json_from_dictionary(cls, mydict):
        return json.dumps(mydict)

在保存到数据库时,可以使用json.dumps(myDictionary)或者通过调用MyModelObject.set_json_field(myDictionary)将Python字典转换为JSON,然后将其存储在模型的json_field中。要将 JSON 数据作为字典检索,您只需调用 MyModel.objects.last().get_json_field_as_dictionary(或您喜欢的任何名称,json_dictionary 可能就是 MyModel.objects.last().json_dictionary),它将返回该属性的值,就好像它是模型中的元素,而不必每次都进行转换。

或者,如果您使用 Postgres 作为后端,使用 JSONField 会容易得多:

class MyModel(models.Model):
    json_field = models.JSONField(null=True)

然后保存:

    myObject = myModel.objects.create(json_field=myDictionary)      

如果您澄清,我可以更新我的答案以更好地解释。

【讨论】:

  • 是的,我正在使用它,但我想在不运行任何其他功能的情况下进行转换,即如果我执行 MyModel.objects.last().json_field 它应该给我 python dict。更像是如果我使用的是旧版本的 Django,我如何才能获得类似 JSONField 的行为
  • 只需调用 MyModel.objects.last().get_json_field_as_dictionary (或任何您想调用的名称),它就会执行此操作 - 属性就像模型的元素一样,但它是一个函数/方法它返回一个值。
  • 这很聪明,我从来没想过,非常感谢这解决了我的问题
【解决方案2】:

您可能想使用JSONField。它允许存储编码为 JSON 的数据并将它们检索为相应的 Python 数据类型,包括字典。

JSONField 仅适用于带有 Django < 3.1 的 PostgreSQL,但适用于带有 Django >= 3.1 的任何数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2011-06-07
    • 2018-11-21
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多