【发布时间】:2018-09-29 03:25:10
【问题描述】:
我有 3 个模型:
class Product(TimeStampedModel):
product_id = models.AutoField(primary_key=True, )
brand = models.ForeignKey('Brand', related_name='products', on_delete=models.CASCADE)
title = models.TextField(blank=False, null=False)
'''...'''
class Brand(models.Model):
brand_id = models.AutoField(primary_key=True,)
brand_name = models.CharField(max_length=50)
shops = models.ManyToManyField('Shop', related_name='shops')
'''...'''
class Shop(models.Model):
shop_id = models.AutoField(primary_key=True,)
shop_name = models.CharField(max_length=30)
'''...'''
我想在我的 HTML 中显示属于这个品牌的 Brand 和 amount of products,就像这样:
FooBar 50
BazFoo 25
BarBob 12
我怎样才能以最快的方式做到这一点?
我试过了:
brands = {}
for prod in products_list:
brands[prod.brand.brand_name] = brands.get(prod.brand.brand_name, 0) + 1
但是这个迭代有时需要大约 7 秒(对于 20k+ 项的列表)。可能有某种 ORM 技巧或其他什么?
P.S. 目前我得到这样的品牌,没有产品数量:
brands = Brand.objects.filter(shops__shop_name__in=[shop])
更新:就像 Ivan 在我更改的 cmets 中建议的那样:
brands = Brand.objects.filter(shops__shop_name__in=[shop]).annotate(amount_of_products=Count('products'))
brands = list(brands)
这减少了页面渲染时间,但该查询仍然需要 1.5-3 秒才能进入页面渲染。有什么办法可以让它更快吗?或者可能是任何其他解决方案,例如异步作业或数据库优化索引?
【问题讨论】:
标签: html django postgresql django-models django-templates