Вот моя упрощенная модель:
class Item(models.Model):
pass
class TrackingPoint(models.Model):
item = models.ForeignKey(Item)
created = models.DateField()
data = models.IntegerField()
class Meta:
unique_together = ('item', 'created')
Во многих частях моего приложения мне нужно получить набор Item
и аннотировать каждый элемент полем data
из последних TrackingPoint
каждого элемента, упорядоченного по полю created
. Например, экземпляр i1
класса Item
имеет 3 TrackingPoint
s:
tp1 = TrackingPoint(item=i1, created=date(2010,5,15), data=23)
tp2 = TrackingPoint(item=i1, created=date(2010,5,14), data=21)
tp3 = TrackingPoint(item=i1, created=date(2010,5,12), data=120)
Мне нужен запрос для извлечения экземпляра i1
, помеченного значением поля tp1.data
, поскольку tp1
является последней точкой отслеживания, упорядоченной в поле created
. Этот запрос должен также вернуть Item
, которые вообще не имеют TrackingPoint
. Если возможно, я предпочитаю не использовать метод QuerySet
extra
для этого.
Это то, что я пытался до сих пор ... и не удалось: (
Item.objects.annotate(max_created=Max('trackingpoint__created'),
data=Avg('trackingpoint__data')).filter(trackingpoint__created=F('max_created'))
Есть идеи?