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

时间:2015-08-24 13:37:12

标签: python django django-templates django-orm

这两种类型的查询之间存在多少性能差异?

说我有这3个型号:

ContentAction = namedtuple('ContentAction', ['date', 'content'])
AuthoredAction = namedtuple('AuthoredAction', ['date', 'author'])

class ActionContainer(ndb.Model):
    actions = ndb.PickleProperty(repeated=True)

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

在模板中,我将其列为:

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

考虑到数据重复问题,两种设置之间存在多大的性能差异?

1 个答案:

答案 0 :(得分:4)

如果您使用select_related,则Django会在提取列表的同时获取相关的copy-on-readmodel数据。

brand

例如,假设您有100个商品。如果没有Listing.objects.filter().select_related('model', 'model__brand') ,则会有201个查询(1个查询用于获取所有商品,100个用于获取每个商品的模型,100个用于获取每个商品的品牌)。使用select_related,一切都在1个查询中获取。

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