获取模型对象简化django init

时间:2016-04-27 20:22:57

标签: python django

我需要修改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

1 个答案:

答案 0 :(得分:2)

情侣选项取决于您愿意做多少重构。

  • 首先,如果您(或可以轻松升级)到Postgres,那么当前版本的django直接支持使用json field,您可以根据需要将查询转换为defer()该字段。< / LI>
  • 下一个选项,将instance_data转换为_instance_data并使用django.utilsinstance_data改为@cached_property。这将允许您在从实例访问它时加载一次,并将自动缓存以供将来使用。

我要注意的最后一点是,请注意你的_post_init(),因为如果它从你的json中盲目设置值,它可能很容易影响你可能想要的值(例如,如果你的json有一个字段,那该怎么办?在其中叫save?)