J'ai une classe Marketorders qui contient des informations sur les ordres uniques du marché et qui sont rassemblées en instantanés du marché (représentés par la classe Snapshot). Chaque commande peut apparaître dans plusieurs instantanés, la dernière ligne étant bien sûr la plus pertinente.Django ORM: Obtenir des rangées en fonction de la valeur maximale d'une colonne
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)
...
Ce que je fais est d'obtenir toutes les commandes à travers plusieurs clichés pour le traitement, mais je veux inclure seulement la ligne la plus récente pour chaque commande. Dans SQL Je voudrais simplement faire:
SELECT m1.* FROM marketorders m1 WHERE reportedtime = (SELECT max(reportedtime)
FROM marketorders m2 WHERE m2.orderid=m1.orderid);
ou mieux encore avec une jointure:
SELECT m1.* FROM marketorders m1 LEFT JOIN marketorders m2 ON
m1.orderid=m2.orderid AND m1.reportedtime < m2.reportedtime
WHERE m2.orderid IS NULL;
Cependant, je ne peux pas comprendre comment faire cela avec Django ORM. Y at-il un moyen d'accomplir cela sans SQL brut?
EDIT: Juste pour clarifier le problème. Disons que nous avons les marketorders suivants (en laissant tout ce que peu d'importance et en utilisant seulement orderid, reportedtime):
1, 09:00:00
1, 10:00:00
1, 12:00:00
2, 09:00:00
2, 10:00:00
Comment puis-je ce qui suit avec le ORM mis en?
1, 12:00:00
2, 10:00:00
Je ne suis pas un expert avec Django, mais il y a peu d'ORM qui peuvent gérer une sous-requête dépendante ou une auto-jointure nulle. On s'attend à ce que parfois vous deviez passer à SQL pour mettre ensemble une requête efficace. – bobince
J'espère que ce n'est pas le cas avec Django. =) J'ai essayé de faire ceci avec les recherches supplémentaires, mais je ne peux pas comprendre comment référencer le orderid original de l'appel supplémentaire (ainsi oui, peut-être que les sous-requêtes dépendantes ne sont pas possibles avec des recherches supplémentaires). Je suis un peu nouveau à Django, donc il se peut aussi que je ne sache pas comment écrire de telles références. –