Есть Foo. У Foo есть лог с его статусами.
from django.db import models
class Foo(models.Model):
name = models.CharField(max_length=32)
class FooStatus(models.Model):
foo = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='statuses')
timestamp = models.DateTimeField(auto_now_add=True)
value = models.CharField(max_length=32)
Нужно вытащить все Foo вместе с их последними статусами.
Что есть:
In [16]: list(Foo.objects.all().annotate(timestamp=F('statuses__timestamp'), status=F('statuses__value')).values('name', 'status', 'timestamp'))
Out[16]:
[{'name': 'Foo1',
'status': 'valid',
'timestamp': datetime.datetime(2016, 11, 7, 18, 42, 19, 548072, tzinfo=<UTC>)},
{'name': 'Foo1',
'status': 'invalid',
'timestamp': datetime.datetime(2016, 11, 7, 18, 42, 25, 953250, tzinfo=<UTC>)},
{'name': 'Foo2',
'status': 'ok',
'timestamp': datetime.datetime(2016, 11, 7, 18, 43, 54, 546427, tzinfo=<UTC>)},
{'name': 'Foo2',
'status': 'broken',
'timestamp': datetime.datetime(2016, 11, 7, 18, 43, 59, 507559, tzinfo=<UTC>)}]
Что нужно:
[{'name': 'Foo1',
'status': 'invalid',
'timestamp': datetime.datetime(2016, 11, 7, 18, 42, 25, 953250, tzinfo=<UTC>)},
{'name': 'Foo2',
'status': 'broken',
'timestamp': datetime.datetime(2016, 11, 7, 18, 43, 59, 507559, tzinfo=<UTC>)}]
Т. е. для каждого объекта нужен его статус с позднейшей датой. И всё это хозяйство хочется одним запросом к б. д.