Django: Wählen Sie Werte mit max Zeitstempeln oder verbinden Sie die gleiche Tabelle

Ich habe ein einfaches Django-Modell

class Server(models.Model): name = models.CharField(max_length=120) class ServerPropertie(models.Model): name = models.CharField(max_length=120) value = models.CharField(max_length=120) timestamp = models.DateTimeField() server = models.ForeignKey(Server) 

Ich möchte eine Get_properties-Methode zum Server-Modell hinzufügen, die alle letzten Eigenschaften für den aktuellen Server zurückgibt. Ich meine, es sollte Name und Wert aller Eigenschaftsnamen für den aktuellen Server zurückgeben und jeder Uniq-Eigentumsname sollte einen Wert haben, wobei die Zeile einen maximalen Zeitstempel hat.

Ich kann es in roh hardcoded roh SQL (ich benutze postgres):

 SELECT t1.name, t1.value FROM environments_serverpropertie t1 JOIN (SELECT max("timestamp") "timestamp", name FROM environments_serverpropertie group by name) t2 on t1.name = t2.name and t1.timestamp = t2.timestamp; 

Oder in Python, aber ich glaube, dass es pythonische Lösung gibt. Kannst du mir bitte Helfen.

  • Wie fügt man eine Zeile mit autoincrement id in eine Multi-Primärschlüssel-Tabelle ein?
  • SQLalchemy gibt an, welcher Index verwendet werden soll
  • Python, Konvertierung CSV-Datei in SQL-Tabelle
  • Wie bekomme ich einen SQL Server gespeicherten Prozedur Rückgabewert mit pyodbc?
  • Pyspark: gegossenes Array mit verschachteltem struct to string
  • Python ist langsam, wenn es über eine große Liste iteriert
  • Pandas read_sql mit Parametern und Wildcard-Operator
  • Python + sqlite, fügen Sie Daten aus Variablen in die Tabelle ein
  • One Solution collect form web for “Django: Wählen Sie Werte mit max Zeitstempeln oder verbinden Sie die gleiche Tabelle”

    Wenn Sie PostgreSQL verwenden, ist die übliche Syntax dafür:

     select distinct on (name) name, value from environments_serverpropertie where server = ... order by name, timestamp desc 

    Aus der PostgreSQL-Dokumentation :

    SELECT DISTINCT ON (Ausdruck [, …]) hält nur die erste Zeile jedes Satzes von Zeilen, wo die angegebenen Ausdrücke gleich auswerten. Die DISTINCT ON-Ausdrücke werden nach denselben Regeln wie für ORDER BY interpretiert (siehe oben). Beachten Sie, dass die "erste Zeile" jedes Satzes unvorhersehbar ist, es sei denn, ORDER BY wird verwendet, um sicherzustellen, dass die gewünschte Zeile zuerst erscheint.

    Sie können sehen und versuchen es in sql Geige Demo .

    Es ist möglich, diese Syntax auf Django zu übersetzen, aus der django Dokumentation :

    Nur auf PostgreSQL können Sie Positionsargumente (* Felder) übergeben, um die Namen der Felder anzugeben, auf die das DISTINCT angewendet werden soll. Dies bedeutet eine SELECT DISTINCT ON SQL-Abfrage.

    Also in django wird es so etwas wie:

     ServerPropertie.objects.filter(...).order_by('name', '-timestamp').distinct('name') 
    Python ist die beste Programmiersprache der Welt.