2011-01-15 40 views
11

Cho một trường;Lựa chọn trường mô hình Django - sẽ không phải là một quyết định tốt hơn?

domain_status_choices = (
    (1,'Live') 
    (2,'Offline') 
    (3,'Dev') 
) 
status = models.SmallIntegerField(choices=domain_status_choices) 

Tôi biết tôi có thể nhận và đặt biểu diễn dạng số và sử dụng get_status_display() để nhận nhãn văn bản. Nhưng nếu người dùng đăng status=Offline thì tôi có thể lấy giá trị số để lưu nó như thế nào? Tôi cũng muốn có thể xác nhận rằng các số hoặc giá trị văn bản nằm trong danh sách.

Với tôi, điều đó có ý nghĩa hơn khi sử dụng dict. Đây là phương pháp hiện tại của tôi;

domain_status_choices = { 
    1: 'Live', 
    2: 'Offline', 
    3: 'Dev', 
} 
status = models.SmallIntegerField(choices=domain_status_choices.iteritems()) 
... 
if input1 not in domain_status_choices.keys(): print "invalid" 
if input2 not in domain_status_choices.items(): print "invalid" 
status = [k for k, v in domain_status_choices.iteritems() if v == input3][0] 

Có cách nào tốt hơn không? Tại sao một bộ tuple thường được sử dụng?

+0

bạn đã thử sử dụng collections.OrderedDict đối với trường hợp sử dụng này? (Để duy trì trật tự của các tùy chọn.) Http://pymotw.com/2/collections/ordereddict.html –

Trả lời

13

Tôi tin rằng các phím của một dict không được đảm bảo để được sắp xếp (trừ khi bạn sử dụng OrderedDict rõ ràng). Tức là, bạn "có thể" nhận các lựa chọn "Ngoại tuyến", "Dev", "Trực tiếp" với phiên bản của mình.

lưu ý thực hiện trên dict.items:

Keys và các giá trị được liệt kê trong một trật tự tùy ý đó là không ngẫu nhiên, thay đổi qua việc triển khai Python, và phụ thuộc vào lịch sử của từ điển của chèn và xóa bỏ.

+0

Đây là một ý nghĩ, trong trường hợp của tôi với các phím số tôi có thể sử dụng một danh sách? (không phải danh sách các bộ dữ liệu) Hoặc, nếu tôi không lo lắng về thứ tự tôi có thể gắn với phương pháp này. – Jake

+0

Nhờ cách Python hoạt động, bạn có thể tự do xây dựng bất cứ thứ gì bạn chuyển tới 'lựa chọn' của Field mà bạn muốn. Nếu bạn chủ yếu sử dụng các lựa chọn theo cách khác, tôi không thấy có gì sai khi chuyển đổi danh sách/dict/bất cứ điều gì chỉ khi chuyển nó sang ' Field (choices =)' (nghĩa là nếu 'iteritems' làm việc cho bạn thì đó là tốt). Vấn đề đơn giản là: Django giả định rằng thứ tự lựa chọn không nên tùy ý. – vicvicvic

3

Mở rộng trên nhận xét của tôi về câu trả lời @ vicvicvic của:

t = [ 'Live', 'Offline', 'Dev', ] 
status = models.SmallIntegerField(choices=[(i,t[i]) for i in range(len(t))]) 
... 
if not 0 <= int(input1) < len(t): print "invalid" 
if input2 not in t: print "invalid" 
status = t.index(input2) 
+3

Sử dụng liệt kê để tăng độ nhạy cảm: '[(i, v) cho i, v trong liệt kê (t)]' – TryPyPy

+4

Điều gì về 'chỉ liệt kê (t)' – Jake

Các vấn đề liên quan