У меня есть класс Marketorders, который содержит информацию об отдельных рыночных ордерах, и они собраны в снимки рынка (представлены классом Snapshot). Каждый заказ может отображаться в нескольких снимках, причем последний ряд, конечно, является релевантным.
class Marketorders(models.Model):
id = models.AutoField(primary_key=True)
snapid = models.IntegerField()
orderid = models.IntegerField()
reportedtime = models.DateTimeField(null=True, blank=True)
...
class Snapshot(models.Model):
id = models.IntegerField(primary_key=True)
...
То, что я делаю, - это получение всех заказов через несколько снимков для обработки, но я хочу включить только самую последнюю строку для каждого заказа. В SQL я бы просто сделал:
SELECT m1.* FROM marketorders m1 WHERE reportedtime = (SELECT max(reportedtime)
FROM marketorders m2 WHERE m2.orderid=m1.orderid);
или еще лучше с объединением:
SELECT m1.* FROM marketorders m1 LEFT JOIN marketorders m2 ON
m1.orderid=m2.orderid AND m1.reportedtime < m2.reportedtime
WHERE m2.orderid IS NULL;
Однако я просто не могу понять, как это сделать с Django ORM. Есть ли способ сделать это без необработанного SQL?
РЕДАКТИРОВАТЬ: Просто чтобы прояснить проблему. Допустим, у нас есть следующие рыночные заказы (исключая все неважные и используя только orderid, в отчетное время):
1, 09:00:00
1, 10:00:00
1, 12:00:00
2, 09:00:00
2, 10:00:00
Как получить следующий набор с ORM?
1, 12:00:00
2, 10:00:00