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查找。所以我认为没有比这更好的了。
请帮帮我
提前谢谢。
答案 0 :(得分:0)
问题不在于是否"调用模型方法是否加载整个对象",因为这是无关紧要的。 "加载整个对象"已经通过get
电话完成了。该方法将对该调用返回的模型对象进行操作,除非您另行指定(例如使用defer
或only
)将是整个对象。
答案 1 :(得分:0)
当您使用get
或filter
然后从这些查询中访问对象时,当且仅当您使用要访问的模型的字段时,才会获得额外的查询。例如,在您的情况下,这些字段将为first_name
和last_name
。
但是如果您有其他型号的外键,则会有所不同。当您尝试访问该模型的字段时,之前进行的简单查询无法从数据库获取另一个对象。因此,当您尝试访问它时,您将再次访问数据库。要解决此问题,您应该看到select_related
和prefetch_related
的文档。
希望它有所帮助!