从模型和外部模型调用值之间的性能差异
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 将在获取列表的同时获取相关的 model
和 brand
数据。
Listing.objects.filter().select_related('model', 'model__brand')
例如,假设您有 100 个商家信息。如果没有 select_related
,将有 201 个查询(1 个查询用于获取所有列表,100 个用于获取每个列表的型号,100 个用于获取每个型号的品牌)。使用 select_related
,所有内容都在 1 个查询中获取。
理论上,对数据进行反规范化(在 Listing
模型中复制属性)可能会提供进一步的性能优势,但这种改进可能可以忽略不计。你必须测量它才能看到。大多数时候,使用 select_related
就足够了。
这两种类型的查询之间的性能差异有多大?
假设我有这 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 将在获取列表的同时获取相关的 model
和 brand
数据。
Listing.objects.filter().select_related('model', 'model__brand')
例如,假设您有 100 个商家信息。如果没有 select_related
,将有 201 个查询(1 个查询用于获取所有列表,100 个用于获取每个列表的型号,100 个用于获取每个型号的品牌)。使用 select_related
,所有内容都在 1 个查询中获取。
理论上,对数据进行反规范化(在 Listing
模型中复制属性)可能会提供进一步的性能优势,但这种改进可能可以忽略不计。你必须测量它才能看到。大多数时候,使用 select_related
就足够了。