2016-06-13 2 views
0

나는 "상태"필드가있는 모델 클래스를 가지고 있는데,이 필드는 choices 옵션을 가지고 있습니다 (각 선택 항목에는 자체 비즈니스 로직이 있습니다). 장고 웹 사이트에 따르면
는 ,이 선택이 설정되는 방법이다 :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 A의 그 선택을 캡슐화 할 수 있습니다 : 당신이 대신 사용하는 경우

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

많은 상태 필드가있을 때 커지면 같은 이름을 다시 사용할 수 없기 때문에 선택 열거 형을 사용할 수 있습니다. -name은 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