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

Python 从模型和外部模型调用值之间的性能差异,python,django,django-templates,django-orm,Python,Django,Django Templates,Django Orm,这两种查询之间的性能差异有多大 假设我有这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

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

假设我有这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>
然后在模板中,我可以简单地列出如下内容:

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

{{listing.model_name}

{{listing.listing_info}

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

如果使用,Django将在获取列表的同时获取相关的
型号
品牌
数据

Listing.objects.filter().select_related('model', 'model__brand')
例如,假设您有100个列表。如果没有
select_related
,将有201个查询(1个查询获取所有列表,100个查询获取每个列表的型号,100个查询获取每个型号的品牌)。使用
select\u related
,在一个查询中获取所有内容

理论上,对数据进行非规范化(复制
列表
模型中的属性)可能会提供进一步的性能优势,但改进可能微不足道。你必须测量它才能看到。大多数情况下,使用
select_related
就足够了。

如果使用,Django将在获取列表的同时获取相关的
模型
品牌
数据

Listing.objects.filter().select_related('model', 'model__brand')
例如,假设您有100个列表。如果没有
select_related
,将有201个查询(1个查询获取所有列表,100个查询获取每个列表的型号,100个查询获取每个型号的品牌)。使用
select\u related
,在一个查询中获取所有内容

理论上,对数据进行非规范化(复制
列表
模型中的属性)可能会提供进一步的性能优势,但改进可能微不足道。你必须测量它才能看到。大多数情况下,使用
select\u related
就足够了