我需要修改django模型中获取对象的方式。以下是我目前正在做的事情:
class GoogleAvail(models.Model):
platform_id = models.CharField(primary_key=True)
master_id = models.IntegerField(blank=True, null=True)
instance_data = models.TextField(blank=True, null=True) # this is json
def _post_init(self):
instance_data = json.loads(self.instance_data)
for k in instance_data:
setattr(self, k, instance_data[k])
return self
现在,当我需要得到一个我打电话的对象时:
>>> a=GoogleAvail.objects.all()[0]
>>> a._post_init()
请注意,我只对获取对象时执行此初始化感兴趣,因为没有必要在10,000个对象上执行json.loads()
(包含大量数据)我要做一个模型管理器在查询集上。
更好的方法是什么,所以它会自动完成,我不需要调用_post_init
?
答案 0 :(得分:2)
情侣选项取决于您愿意做多少重构。
defer()
该字段。< / LI>
instance_data
转换为_instance_data
并使用django.utils将instance_data
改为@cached_property
。这将允许您在从实例访问它时加载一次,并将自动缓存以供将来使用。我要注意的最后一点是,请注意你的_post_init()
,因为如果它从你的json中盲目设置值,它可能很容易影响你可能想要的值(例如,如果你的json有一个字段,那该怎么办?在其中叫save
?)