tôi không sử dụng Django, nhưng tôi làm điều gì đó giống như sau một chút khá dưới Kim tự tháp và Twisted ...
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)
Vì vậy, bản chất là thế này:
- Có một lớp cơ sở "hằng số" và một lớp khác cho mỗi loại. lớp học xác định từ khóa cho một giá trị trong ALLCAPS
- Tôi cũng ném vào bản rõ văn bản
_pairs
vào lớp học. tại sao? bởi vì tôi có thể cần phải xây dựng một số bảng DB với họ, hoặc tôi có thể muốn chúng cho các thông báo lỗi/trạng thái. Tôi sử dụng các con số và không phải là tên biến ALLCAPS như là một sở thích cá nhân.
- tôi khởi tạo biến số lớp
mapping
cơ bản monkeypatches lớp bằng cách biên dịch trước một loạt biến trong một dict bởi vì ...
- lớp được bắt nguồn từ lớp cơ sở đó, cung cấp chức năng classmethod để tìm kiếm giá trị hoặc làm những thứ tiêu chuẩn khác mà bạn thường cần phải làm với hằng số.
Đó không phải là phương pháp tiếp cận một kích thước phù hợp, nhưng tôi thường thực sự thích điều này. Bạn có thể dễ dàng sử dụng dict để định nghĩa các cặp, có chức năng 'ánh xạ' thiết lập một số thuộc tính khác, chẳng hạn như cung cấp cho bạn các giá trị cặp như k, v hoặc v, k hoặc bất kỳ định dạng lạ nào bạn có thể cần.
mã của tôi sau đó có thể trông như thế này:
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]
bất cứ khi nào bạn cần sử dụng các hằng số trong một cách khác, bạn chỉ cần thêm hoặc thay đổi classmethods của các cơ sở.
Nguồn
2012-10-10 16:07:26
Bạn đã đọc phương pháp thú vị này sử dụng '__metaclass__'? http://tomforb.es/using-python-metaclasses-to-make-awesome-django-model-field-choices –