在我的應用程序的一個頁面中,我試圖爲每家公司展示最昂貴的汽車。我的模型看起來大致是這樣的:從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