2013-05-21 45 views
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()将有效

Django的模型优化

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

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

请回复。如果您有关于此主题的信息,请分享您的任何经验,如果您有任何经验,请与任何统计数据进行比较 请注意,这是一个示例,而不是实际使用案例,该模型还包含许多其他字段。

很少会觉得使用defer()only()也会给出预期的结果。但是我在django文档中发现,它基本上只能防止这些字段数据被转换为python对象,而不是用sql查找。所以我认为这不会更好。 请帮我出来 在此先感谢。

回答

0

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

+0

所以将使用延迟或只使用值相同Django文档指定在构建具有延迟字段的模型时存在轻微的开销。我不完全能够理解的是,开销是多少,如果它更好地使用价值的东西。 –

+0

不,'defer' /'只'给你一个实际的模型实例,你可以在其上调用你的方法,但是缺少一些字段。 'values'给你一个字典,而不是一个实例,所以你不能调用你的方法。在这一点上,虽然我不禁感到你在过度优化:你是否检查过这实际上是一个瓶颈? –

+0

那么你是说调用model.objects.only('first_name','last_name')。get()。full_name()将与调用values方法相同。但我认真地怀疑这是唯一的方法是防止从sql到python对象的转换,而不是在sql级别查找。所以我认为这可能不会那么快。 –

0

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

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

希望它有帮助!