2016-06-13 50 views
0

我有一個模型類與一些「狀態」字段,其中有choices選項(每個選項都有自己的業務邏輯)。
根據Django的網站,這是選擇應該如何設置:django寫模型字段選擇的更好方法?

class Order: 
    STATUS_ACTIVE = 1 
    STATUS_ENDED = 2 
    STATUS_CANCELED = 3 
    ORDER_STATUS_CHOICES = ((STATUS_ACTIVE, 'Active'), 
          (STATUS_ENDED, 'Ended'), 
          (STATUS_CANCELED, 'Canceled'),) 

    order_status = models.IntegerField(choices=ORDER_STATUS_CHOICES) 
    order_status2 = models.IntegerField(choices=ORDER_STATUS2_CHOICES) 

的問題是,它讓你感覺很糟垃圾郵件我的模型類的許多領域有很多選擇,但它可能以某種方式封裝它,但仍然保留這些選擇裏面模型類?

我使用一個內部類像

class OrderStatus: 
     STATUS_ACTIVE = 1 
     STATUS_ENDED = 2 

但是從內部模型類引發錯誤引用Order.OrderStatus.STATUS_ACTIVE嘗試。

+0

爲什麼要保持它在模型內? –

+0

導致這些選擇與模型字段相關?另外根據django網站,最好在課堂上做出選擇..但是如果我看到它們變大,我可能會將它們分開 – user3599803

回答

1

您可以在dict封裝的選擇:

status1 = {'STATUS_ACTIVE': 1, 
    'STATUS_ENDED': 2, 
    'STATUS_CANCELED': 3, 
    'ORDER_STATUS_CHOICES': ((STATUS_ACTIVE, 'Active'), 
          (STATUS_ENDED, 'Ended'), 
          (STATUS_CANCELED, 'Canceled'),)} 


    order_status = models.IntegerField(choices=status1['ORDER_STATUS_CHOICES']) 
    order_status2 = models.IntegerField(choices=status2['ORDER_STATUS_CHOICES']) 
+0

這很好,給我一個想法 – user3599803

+0

這就是我在這裏做的。 –

1

如果django doc告訴你這樣做,它不是垃圾郵件,而是人們如何使用它們。你可以做同樣的事情用更少的代碼:

STATUS_ACTIVE, STATUS_ENDED, STATUS_CANCELED = range(1, 4) 
+0

當你有很多狀態字段時它變得更大,你也不能再使用相同的名字,所以選擇enum像ACTIVE這樣的名稱出現在兩個模型字段的選項中,你不能再次使用它。所以我試圖封裝它 – user3599803

0

如果你使用這個,而不是什麼會改變嗎?

ORDER_STATUS_CHOICES = ( (1, 'Active'), (2, 'Ended'), (3, 'Canceled') )

或者這個?

ORDER_STATUS_CHOICES = ( ('1', '1-Active'), ('2', '2-Ended'), ('3', '3-Canceled') )

+0

當做邏輯我將不得不比較'1',而不是一些枚舉類型..今天我可以做instance.status == Order.ACTIVE,更清晰的代碼 – user3599803