从数据库加载数据后,执行操作的最佳方法是什么,例如从表单字段解析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上的新迁移不兼容。
谢谢!