nie używam Django, ale zrobić coś jak następuje całkiem sporo pod piramidy i zakręcony ...
def setup_mapping(pairs):
mapping = {'id':{},'name':{}}
for (k,v) in pairs:
mapping['id'][k]= v
mapping['name'][v]= k
return mapping
class ConstantsObject(object):
_pairs= None
mapping= None
@classmethod
def lookup_id(cls , id):
pass
@classmethod
def lookup_name(cls , name):
pass
class StatusConstants(ConstantsObject):
CANCELLED = -1
REQUIRES_ATTENTION = 0
WORK_IN_PROGRESS = 1
COMPLETE = 2
_pairs= (
(-1, 'Cancelled'),
(0, 'Requires attention'),
(1, 'Work in progress'),
(2, 'Complete'),
)
mapping= setup_mapping(_pairs)
Zatem istotą jest to:
- Jest podstawowa klasa "stałe" i inna klasa dla każdego typu. klasa definiuje słowa kluczowe do wartości w ALLCAPS
- Wrzucam też do klasy tekstowej
_pairs
. czemu? ponieważ może będę potrzebował zbudować z nimi tabele DB lub będę ich potrzebował dla komunikatów o błędach/statusie. Używam numerów, a nie nazwy zmiennej ALLCAPS jako osobistych preferencji.
- zainicjować zmienną
mapping
klasy, które w zasadzie monkeypatches klasę przez prekompilacja kilka zmiennych w dict ponieważ ...
- klasa jest wyprowadzona z klasy bazowej, która oferuje classmethod funkcjonalność, aby szukać wartości lub zrobić inne standardowe rzeczy, które często musisz zrobić ze stałymi.
Nie jest to podejście uniwersalne, ale ogólnie bardzo mi się to podoba. Możesz łatwo użyć dyktowania, aby zdefiniować pary, ustaw funkcję "mapowanie" na kilka innych atrybutów, na przykład dając krotki wartości pary jako k, v lub v, k lub dowolny dziwny format, który może być potrzebny.
mój kod może wtedy wygląda to tak:
status_id = sa.Column(sa.Integer, sa.ForeignKey("_status.id") , nullable=False , default=constants.StatusConstants.CANCELLED)
status_name = constants.StatusConstants.lookup_id(status_id)
status_name = constants.StatusConstants.mapping['id'][status_id]
gdy trzeba użyć stałych w inny sposób, wystarczy dodać lub zmienić classmethods podstawy.
Czy znasz to interesujące podejście, które używa '__metaclass__'? http://tomforb.es/using-python-metaclasses-to-make-awesome-django-model-field-choices –