1
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 查找中。因此,我不认为这会更好。请帮助我提前谢谢。

4

2 回答 2

0

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

于 2013-05-21T11:42:07.600 回答
0

当您使用getorfilter然后从这些查询集中访问一个或多个对象时,当且仅当您使用正在访问的模型的字段时,您不会获得额外的查询。例如,在您的情况下,这些字段将是first_nameand last_name

但如果您有其他模型的外键,情况就不同了。当您尝试访问该模型的字段时,您之前所做的简单查询不会从数据库中获取另一个对象。因此,当您尝试访问它时,您将再次访问您的数据库。要解决此问题,您应该查看 和 的select_related文档prefetch_related

希望能帮助到你!

于 2013-06-26T00:36:14.720 回答