Django ORM, wie man values ​​() benutzt und trotzdem mit choicefield arbeitet?

8

Ich verwende django v1.10.2

Ich versuche dynamische Berichte zu erstellen, in denen ich Felder und Bedingungen und die wichtigsten Informationen zum ORM-Modell in der Datenbank hinterlasse.

Mein Code für die Erstellung des dynamischen Berichts ist

%Vor%

Also main_model_name kann alles sein.
Das funktioniert großartig, außer dass manchmal assoziierte Modelle von main_model choicefield haben.

Also für einen der Berichte main_model ist Pallet .
Pallet hat viele PalletMovement .
Meine Anzeigespalten sind: serial_number , created_at , pallet_movement__location

Die ersten beiden Spalten sind Felder, die zu Pallet model gehören. Die letzte stammt von PalletMovement

Was passiert, ist, dass PalletMovement model so aussieht:

%Vor%

Da das Anfrageset mir die Rohwerte zurückgibt, wie kann ich das choicefield in PalletMovement -Modell verwenden, um sicherzustellen, dass pallet_movement__location mir die Anzeige von AB-Delaware oder CD-Delaware anzeigt?

Beachten Sie, dass main_model alles abhängig von dem sein kann, was ich in der Datenbank speichere.

Vermutlich kann ich mehr Informationen in der Datenbank speichern, um die Filterung und Präsentation von Daten noch besser zu machen.

    
Kim Stacks 05.08.2017, 07:10
quelle

4 Antworten

4

Die Methode values() gibt ein Wörterbuch mit Schlüssel / Wert-Paaren zurück, das Ihren Feldnamen und einen entsprechenden Wert darstellt.

Zum Beispiel:

Modell:

%Vor%

Abfrage:

%Vor%

Ergebnis:

%Vor%

Sie können dieses Ergebnis jetzt wie ein normales Wörterbuch bearbeiten:

%Vor%

Sie können dies sogar zu einer Funktion für eine bessere Wiederverwendbarkeit machen:

%Vor%

Ich empfehle die Verwendung der Methoden update() und get() , da sie Sie vor möglichen Fehlern wie:

bewahren
  • Die search_key existiert nicht in choice_dict und get() gibt den Wert von search_key zurück
  • update() wird versuchen, das angegebene Schlüssel / Wert-Paar zu aktualisieren, falls es existiert, andernfalls wird es dem Wörterbuch hinzugefügt.

Wenn die obige Verwendung in der Schablonendarstellung Ihrer Daten verwendet wird, können Sie ein benutzerdefinierter Vorlagenfilter stattdessen:

%Vor%

Sehen Sie hier einen zusätzlichen Blick: Django: Wie kann der Anzeigewert eines ChoiceFields in der Vorlage mit dem tatsächlichen Wert und den Auswahlmöglichkeiten angezeigt werden?

    
John Moutafis 09.08.2017 09:26
quelle
1

Sie würden get_foo_display

verwenden

In Ihrer Vorlage:

%Vor%

oder

%Vor%

[Edit:] Wie in den Kommentaren erwähnt, funktioniert dies nicht beim Aufruf von values()

    
The_Cthulhu_Kid 08.08.2017 08:28
quelle
1

Eine Alternative zum Erstellen eines TemplateTags ist:

%Vor%

Dies zeigt den Wert der Anfangsdaten des Fremdschlüsselfelds anstelle der ID.

    
wololoooo 10.08.2017 12:12
quelle
1

Die universelle Lösung für jedes main_model_name ist von Django Model _meta API introspection: class_object._meta.get_field(field_name).choices
Das ist:

%Vor%

Der Rest ist ein triviales Beispiel , meist kopierter Code aus der Frage

%Vor%

Es funktioniert genauso mit 'palet_id' oder mit 'pallet' in display_columns . Selbst das "_meta" beginnt mit einem Unterstrich, es ist eine dokumentierte API.

    
hynekcer 10.08.2017 20:51
quelle