从模型和外部模型调用值之间的性能差异

Performance difference between calling values from model and foreign model

这两种类型的查询之间的性能差异有多大?

假设我有这 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()

我在模板中显示了数千个列表,我想为每个列表显示 brand_name 和 model_name。

在模板中我这样列出:

<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>

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

如果您使用 select_related,那么 Django 将在获取列表的同时获取相关的 modelbrand 数据。

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

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

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