Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在从数据库加载数据后立即执行某些操作?_Django_Django Models_Yaml - Fatal编程技术网

Django 如何在从数据库加载数据后立即执行某些操作?

Django 如何在从数据库加载数据后立即执行某些操作?,django,django-models,yaml,Django,Django Models,Yaml,从数据库加载数据后,执行操作(例如从表单字段解析JSON或YAML)的最佳方式是什么 我的用例是:我有一个名为Puzzle的模型,其中包含一些字段和一个data字段,其中包含YAML(也可以是JSON,没关系)。在下面的代码中,每当我想从该YAML访问属性时,我都会运行YAML解析器并获取该信息 # models.py import yaml class Puzzle(models.Model): name = models.CharField(max_length=100, blan

从数据库加载数据后,执行操作(例如从表单字段解析JSON或YAML)的最佳方式是什么

我的用例是:我有一个名为
Puzzle
的模型,其中包含一些字段和一个
data
字段,其中包含YAML(也可以是JSON,没关系)。在下面的代码中,每当我想从该YAML访问属性时,我都会运行YAML解析器并获取该信息

# models.py
import yaml

class Puzzle(models.Model):
    name = models.CharField(max_length=100, blank=True)

    data = models.TextField()

    def load_data(self):
        return yaml.load(self.data)

    @property
    def coords(self):
        d = self.load_data()
        return d['coords']

    @property
    def clues(self):
        d = self.load_data()
        return d['clues']
示例YAML

coords: [[0, 0], [1, 1], [6, 8]]
clues:
    - Clue #1
    - Another Clue
# more fields, with arrays, dictionaries, etc
每次调用属性时运行解析器都是浪费

一个可能的解决方案是做一个简单的缓存:查看YAML之前是否已被解析,如果没有,则将其存储在某个字段中,稍后再使用。这将引入在每个属性方法中复制/粘贴的额外代码

当从数据库查询数据时,我希望只运行一次解析器。在我的模型中重写
\uuuuu init\uuuuu
可能会起作用,但我不确定这是否会破坏某些东西。

我已经检查了,但是我不确定它是否只解析一次YAML数据。而且,它似乎与Django 1.7上的新迁移不兼容

谢谢