2017-03-21 4 views
-3

Schreiben von Code, der JSON generiert. Der letzte Abschnitt von JSON hat von einem „“ beendet werden, so dass in dem Code, den ich habe:django - queryset.last() liefert keine richtige Reihenfolge/letzten Datensatz

- eine queryset definieren unterschiedliche Werte des Datenbankfeldes abzurufen:

databases_in_workload = DatabaseObjectsWorkload.objects.filter(workload=migration.workload_id).values_list('database_object__database', flat=True).distinct() 

- Dann ich fahre über sie:

for database_wk in databases_in_workload: 
     ... do something 
     if not (database_wk == databases_in_workload.last()): 

       job_json_string = job_json_string + '} ],' 
     else: 
      job_json_string = job_json_string + '} ]' 

ich die letzte Sendung aufnehmen möchten, durch eine eckige Klammer beendet werden, die vorhergehende durch ein Komma. Aber stattdessen passiert das Gegenteil.

Ich schaute auch auf den Inhalt der Datenbanktabelle. Die Werte, die ich für "database_wk" habe, sind user02 (für die Datensätze mit einem niedrigeren Wert des Primärschlüssels) und user01 (für die Datensätze mit dem höheren Wert von pk im DB). Die Reihenfolge (wenn user01 die erste oder die letzte ist) spielt keine Rolle, solange der letzte Datensatz korrekt von last() identifiziert wird. Wenn also user02, user01 in den Iterationen der Abfragegruppe enthalten ist, erwarte ich last() Benutzer01. Allerdings - das funktioniert nicht richtig. Was ist seltsam ist, dass, wenn in der Datenbank (Postgres) Reihenfolge geändert wird (zuerst user01, dann user02 nach Primärschlüsselwerte sortiert) dann funktioniert der "if" Code oben, aber in meiner Situation scheint last() die zurück zu geben erste Aufzeichnung, nicht die letzte. Es ist, als gäbe es eine Reihenfolge in der Datenbank, eine andere in der Abfragegruppe, und last() nimmt die Datenbankreihenfolge ... Jeder hat dieses Problem schon früher entdeckt/gelöst? Alternativ - jede andere Methode zum Identifizieren des letzten Datensatzes in einem Abfragesatz (anders als last()), den ich ausprobieren könnte, würde ebenfalls helfen. Vielen Dank im Voraus!

+0

generieren json von Hand mit nur ein komplettes WTF - dort im stdlib ein 'json' Paket ist, das weiß, wie Python zu Json serialisiert. –

Antwort

1

Der Grund ist das Verhalten, weil es keine Reihenfolge angegeben ist. Versuchen Sie es mit order_by. REF

Von: queryset.first()

Wenn die QuerySet keine Ordnung hat definiert, dann wird der queryset automatisch vom Primärschlüssel

bestellt

Von: queryset.last()

Arbeiten wie zuerst(), gibt aber das letzte Objekt im Abfrage-Set zurück.

Wenn Sie nicht wollen, order_by dann verwenden, versuchen queryset.latest()

Verwandte Themen