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

时间:2014-10-06 19:22:09

标签: django django-models yaml

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

我的用例是:我有一个名为Puzzle的模型,其中包含一些字段和一个包含YAML的data字段(可能也是一个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,如果没有,则将其存储在某个字段中并稍后使用。这引入了将在每个属性方法中复制/粘贴的额外代码。

我想要的是在从数据库中查询数据时只运行一次解析器。在我的模型中覆盖__init__可能会有效,但我不确定这是否会破坏某些内容。

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

谢谢!

0 个答案:

没有答案