Django模型优化

时间:2013-05-21 11:33:43

标签: django django-models django-queryset

Class Model(models.Model):
   .......
   .......
   .......
   .......
   first_name = models.CHarField(max_length = 50)
   last_name = models.CharField(ma_lenghth = 50)

   def full_name():
      return '%s %s' %(self.first_name, self.last_name)
  • 调用Models.objects.get().full_name()效率很高

  • Model.objects.filter().values('first_name, 'last_name')而不是 稍后添加字符串会更好。

问题在于数据库优化。基本上我想知道调用模型的方法是否加载整个对象。如果不是我觉得两者都会导致相同的数据库操作,但如果它加载整个对象而不是值方法将是更好的优化。

请回复。如果您对此主题有任何经验,也可以分享任何比较统计数据(如果有)。 请注意,这是一个示例而不是实际用例,该模型还包含许多其他字段。

很少有人会觉得使用defer()only()也会产生预期效果。但是我在django文档中发现的是它基本上只能阻止那些字段数据转换为python对象而不是sql查找。所以我认为没有比这更好的了。 请帮帮我 提前谢谢。

2 个答案:

答案 0 :(得分:0)

问题不在于是否"调用模型方法是否加载整个对象",因为这是无关紧要的。 "加载整个对象"已经通过get电话完成了。该方法将对该调用返回的模型对象进行操作,除非您另行指定(例如使用deferonly)将是整个对象。

答案 1 :(得分:0)

当您使用getfilter然后从这些查询中访问对象时,当且仅当您使用要访问的模型的字段时,才会获得额外的查询。例如,在您的情况下,这些字段将为first_namelast_name

但是如果您有其他型号的外键,则会有所不同。当您尝试访问该模型的字段时,之前进行的简单查询无法从数据库获取另一个对象。因此,当您尝试访问它时,您将再次访问数据库。要解决此问题,您应该看到select_relatedprefetch_related的文档。

希望它有所帮助!