Wenn Sie ein Modellfeld mit einer Auswahloption haben, neigen Sie dazu, einige magische Werte mit lesbaren Namen assoziiert zu haben. Gibt es in Django eine bequeme Möglichkeit, diese Felder mit dem für Menschen lesbaren Namen anstatt mit dem Wert zu versehen?Setzen Sie Django IntegerField nach Auswahl = ... Name
Betrachten Sie dieses Modell:
class Thing(models.Model):
PRIORITIES = (
(0, 'Low'),
(1, 'Normal'),
(2, 'High'),
)
priority = models.IntegerField(default=0, choices=PRIORITIES)
Irgendwann wir eine Sache Instanz haben, und wir wollen seine Priorität setzen. Natürlich könnten Sie das tun,
thing.priority = 1
Aber das zwingt Sie, die Value-Name-Zuordnung von PRIORITIES zu merken. Dies funktioniert nicht:
thing.priority = 'Normal' # Throws ValueError on .save()
Zur Zeit habe ich diese dumme Abhilfe:
thing.priority = dict((key,value) for (value,key) in Thing.PRIORITIES)['Normal']
aber das ist klobig. Angesichts der Häufigkeit dieses Szenarios fragte ich mich, ob jemand eine bessere Lösung hätte. Gibt es eine Feldmethode zum Festlegen von Feldern nach Wahlnamen, die ich völlig übersehen habe?
Das ist eine schön detaillierte Blog-Posting zu diesem Thema. Schwer zu finden bei Google auch so danke. –
FWIW, wenn Sie es aus einem Literal String (vielleicht aus einem Formular, Benutzereingabe oder ähnliches) setzen Sie können dann tun Sie einfach: thing.priority = getattr (thing, strvalue.upper()). – mrooney
Wirklich wie die Kapselung Abschnitt auf dem Blog. –