2010-01-26 5 views
31

개체의 상태를 유지하는 데 사용되는 모듈이있는 필드가 있습니다. 지금까지 사용한 :Django : 모듈에서 "상태"필드를 구현하는 가장 좋은 방법

ORDER_STATUS = ((0, 'Started'), (1, 'Done'), (2, 'Error')) 
status = models.SmallIntegerField(choices=ORDER_STATUS) 

그것의 변환이 용이 한 방법 :

def status_str(self): return ORDER_STATUS[self.status][1] 

업데이트 할 때 문제입니다. 나 자신과 같은 코드를 가진 발견 :

동기화 할 정말 열심히 아주 끔찍 및 도착
order.status = 2 # Error Status 

. 나는 해결책이 C의 enum {}과 비슷한 것이라고 생각한다. 아니면이 문제를 해결할 완전히 다른 방법이 있을까요?

감사

+0

가능한 중복 [선택하여 설정 장고 IntegerField = ... 이름] (http://stackoverflow.com/questions/1117564/set-django-integerfield-by-choices-name) –

답변

31

은 어쩌면이 질문은 당신을 도와줍니다 : Set Django IntegerField by choices=… name.
나는 (조정에) 허용 대답에서 인용) : 다음

PENDING = 0 
DONE = 1 
STATUS_CHOICES = (
    (PENDING, 'Pending'), 
    (DONE, 'Done'), 
) 

을 수행 할 수 있습니다 :
STATUS_CHOICES 필드의 choices 옵션을 물려되는리스트)입니다 (클래스에이를 넣어 do order.status = Order.DONE. 당신이하지을


는 (읽기) 값, 장고 provides the method get_status_display itself를 검색하기 위해 자신의 메소드를 구현해야합니다.

+1

업데이트 된 링크 : https://docs.djangoproject.com/en/1.6/ref/models/instances/#django.db.models.Model. get_FOO_display – steps

+1

2016 년에 작동하는 링크 : https://docs.djangoproject.com/en/1.9/topics/db/models/#field-options –

2

당신이 열거 패키지를 시도 할 수 있습니다 : http://pypi.python.org/pypi/enum/

+0

Django 데이터베이스에 이러한 것들이 얼마나 지속되는지 알지 못합니다. 이 답변을 해당 주제로 확장 할 수 있습니까? – jonalv

+0

참조 : https://github.com/5monkeys/django-enumfield – antonagestam

2

status_str 메소드가 필요하지 않습니다. 장고는 정확히 똑같은 것을 수행하는 get_status_display()을 자동으로 제공합니다. 역 회전

, 당신은이를 사용할 수 있습니다

이제
def set_order_status(self, val): 
    status_dict = dict(ORDER_STATUS) 
    self.status = status_dict[val][0] 

당신이 할 수 있습니다 : 나는 보통이 상황에서 무엇을

order.set_order_status('Done') 
+0

좋은 생각이지만 _ ** 잘못된 ** _. Asker가 정의한대로'ORDER_STATUS'를 사용하면'status_dict'를'{0 : 'Started', 1 : 'Done', 2 : 'Error'}'로 설정합니다. 사전 키는 문자열이 아니라 숫자입니다. 제안한대로 메서드를 호출하면 'KeyError :'Done '오류가 발생합니다. 'status_dict'를'ORDER_STATUS의 x에 대해 status_dict = {x [1] : x [0]'로 변경하고'self.status'를'self.status = status_dict [val]'로 변경하십시오. –

8

은 다음과 같습니다

models.py를

from static import ORDER_STATUS  
status = models.PositiveSmallIntegerField(choices=ORDER_STATUS) 

정적.평

이제
ORDER_STATUS = ((0, 'Started'), (1, 'Done'), (2, 'Error')) 
ORDER_STATUS_DICT = dict((v, k) for k, v in ORDER_STATUS) 

당신은 할 수 있습니다 : 당신이 할 거라고 그런

def status_code(self, text): 
    return [n for (n, t) in self.ORDER_STATUS if t == text][0] 

:

order.status = order.status_code('Error') 
0

아마 같은 모델의 메소드를 스틱 이것은 아주 늦은 대답이지만, 완성을 위해 나는 django- model-utils에는 이미 StatusField이 포함되어 있으며 더 나은 것은 StatusModel입니다. 나는 그것을 사용할 필요가있는 모든 곳에서 그것을 사용하고있다.

context['value'] = Model_name.objects.order_by('-choice') 

을 다음과 같이

5

from static import ORDER_STATUS_DICT 
order.status = ORDER_STATUS_DICT['Error'] 
+1

최소한의 상용구로 유사한 옵션을 제공하는 또 다른 라이브러리는'django-choices'입니다. https://github.com/bigjason/django-choices –

0

는 views.py에서 변경 소지품 모든 작업을 수행하지 않는 경우

choice = ('pending','solved','closed') 
관련 문제