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:
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.
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:
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?
Sie würden get_foo_display
In Ihrer Vorlage:
%Vor%oder
%Vor% [Edit:] Wie in den Kommentaren erwähnt, funktioniert dies nicht beim Aufruf von values()
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:
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.
Tags und Links python django django-queryset django-orm choicefield