【问题标题】:Performance difference between calling values from model and foreign model从模型和外国模型调用值之间的性能差异
【发布时间】:2015-11-17 23:04:21
【问题描述】:

这两种查询的性能差异有多大?

假设我有这 3 个模型:

class Brand(models.Model):
    brand_name = models.CharField()

class Model(models.Model):
    brand = Models.ForeignKey(Brand)
    model_name = models.CharField()

class Listing(models.Model):
    model = Models.ForeignKey(Model)
    listing_info = models.CharField()

我在模板中显示了数千个列表,我想显示每个列表的品牌名称和型号名称。

在模板中我这样列出:

<p>{{ listing.model.brand.brand_name }}</p>
<p>{{ listing.model.model_name }}</p>
<p>{{ listing.listing_info }}</p>

现在考虑我是否在列表模型中列出了这些值(复制数据):

class Listing(models.Model):
    model = Models.ForeignKey(Model)
    brand_name = models.CharField()
    model_name = models.CharField()
    listing_info = models.CharField()

然后在模板中我可以简单地列出:

<p>{{ listing.brand_name }}</p>
<p>{{ listing.model_name }}</p>
<p>{{ listing.listing_info }}</p>

除了数据重复的问题之外,这两种设置之间的性能差异有多大?

【问题讨论】:

    标签: python django django-templates django-orm


    【解决方案1】:

    如果你使用select_related,那么Django会在获取listing的同时获取相关的modelbrand数据。

    Listing.objects.filter().select_related('model', 'model__brand')
    

    例如,假设您有 100 个列表。如果没有select_related,将有 201 个查询(1 个查询用于获取所有列表,100 个查询用于获取每个列表的型号,100 个查询用于获取每个型号的品牌)。使用select_related,所有内容都在 1 个查询中获取。

    理论上,对数据进行非规范化(在Listing 模型中复制属性)可能会提供进一步的性能优势,但这种改进可能可以忽略不计。你必须测量它才能看到。大多数时候,使用select_related 就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 2016-12-03
      • 1970-01-01
      • 2018-05-31
      相关资源
      最近更新 更多