在我的应用程序的一个页面中,我试图为每家公司展示最昂贵的汽车。我的模型看起来大致是这样的:从queryset中建立最高价格列表的最有效方法?
class Company(models.Model):
id = models.IntegerField(primary_key=True)
company = models.CharField(max_length=100)
headcount = models.IntegerField(null=False)
info = models.CharField(max_length=100)
class Car(models.Model):
id = models.IntegerField(primary_key=True)
company_unique = models.ForeignKey(Company)
company = models.CharField(max_length=50)
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
所以,我要建立一个由每家公司的最昂贵的汽车对象的列表。
我走近这样的问题:
company_list = Company.objects.all()
most_expensive = []
for company in company_list:
most_expensive.append(Car.objects.filter(company_unique=company.id).order_by("-price")[0])
然而,这似乎是一个非常低效的方法。我可以用Django Debug Toolbar看到,这段代码让太多的mysql查询变得很麻烦。
有人可以建议一个更好的方式来建立这个名单,这将打击MySQL可能只是一次或两次?
使用这些内置函数可能会减少查询数量:https://docs.djangoproject.com/en/1.10/topics/db/optimization/#retrieve-everything-at-once-if-you-know-you-will -need-it – Erik