2016-11-18 53 views
2

最大考慮一個簡單的模型:在Django的ORM,得到記錄,其字段值是一個QuerySet

class Person(models.Model): 
    name = models.CharField(max_length=256) 
    age = models.IntegerField() 

我想一個表達式返回所有Person對象,其年齡的QuerySet是最大的桌子。即假設有20 Person記錄,最大年齡爲70,但有3個不同記錄具有該值。我希望我的查詢集恰好包含那些3 Person對象。

我想我可以做的:

Person.objects.filter(age=Person.objects.aggregate(models.Max('age'))['age__max']) 

但哇,這似乎是一個真正的混亂。它擊中數據庫兩次。呸。

更好的選擇?

回答

1

我不能直接回答你的問題,但我覺得你不應該爲了在一個查詢中得到這個而毆打,讓你的代碼清晰也很重要。那麼,爲什麼不這樣做:

from django.db.models import Max 
# assumes that you have at least one record 
max_age = Person.objects.aggregate(Max('age'))['age__max'] 
oldest_folks = Person.objects.filter(age=max_age) 

Max將在SQL語句做MAXfilter會做一個簡單的SQL查詢,沒有任何操作都非常昂貴。

相關問題