我在將一些SQL翻譯成Django時遇到了麻煩。Django ORM:獲取不同字段的最新記錄
想象一下,我們有一些汽車,每輛汽車都有一個獨特的VIN,我們用其他數據記錄他們在商店的日期。 (請忽略一個可能結構中的數據這樣的原因,它是專門爲這個問題。:-))
class ShopVisit(models.Model):
vin = models.CharField(...)
date_in_shop = models.DateField(...)
mileage = models.DecimalField(...)
boolfield = models.BooleanField(...)
我們希望有一個單一查詢與最近的記錄返回一個QuerySet每個vin
和更新它!
special_vins = [...]
# Doesn't work
ShopVisit.objects.filter(vin__in=special_vins).annotate(max_date=Max('date_in_shop').filter(date_in_shop=F('max_date')).update(boolfield=True)
# Distinct doesn't work with update
ShopVisit.objects.filter(vin__in=special_vins).order_by('vin', '-date_in_shop).distinct('vin').update(boolfield=True)
是的,我可以迭代查詢集。但這不是非常有效,而且我處理大約2百萬條記錄需要很長時間。可以做到這一點的SQL是(我想!):
SELECT *
FROM cars
INNER JOIN (
SELECT MAX(dateInShop) as maxtime, vin
FROM cars
GROUP BY vin
) AS latest_record ON (cars.dateInShop= maxtime)
AND (latest_record.vin = cars.vin)
那麼我怎麼能使這與Django發生?
我要試試這個!我沒有看到1.11的'Subquery'功能 - 它很有前途。 –
我還沒有測試過這樣的代碼 - 我的模型略有不同。儘管我確實使用了這個想法。謝謝! –