2010-08-20 3 views
6

나는 당신이 key의 기본 값은 임의의 16 문자열 인 것을 알 수 있습니다이모델 필드의 임의/비 상수 기본값?

class SecretKey(Model): 
    user = ForeignKey('User', related_name='secret_keys') 
    created = DateTimeField(auto_now_add=True) 
    updated = DateTimeField(auto_now=True) 
    key = CharField(max_length=16, default=randstr(length=16)) 
    purpose = PositiveIntegerField(choices=SecretKeyPurposes) 
    expiry_date = DateTimeField(default=datetime.datetime.now()+datetime.timedelta(days=7), null=True, blank=True) 

같이 보입니다 모델을 가지고있다. 문제는이 값이 캐시되고 여러 번 연속 사용되는 것 같습니다. 매번 다른 문자열을 얻을 수있는 방법이 있습니까? (고유성/충돌은 신경 쓰지 않습니다.)

+1

Daniel의 답변도 '만료 _ 날짜'에 적용해야합니다. 현재 코드로 원하는 결과를 얻지 못합니다. –

+0

@ [iquadrat : 예 ... 나는 또한 그것을 알아 차렸다. 감사. – mpen

답변

10

예, SecretKey의 새 인스턴스를 만들 때가 아니라 모델 메타 클래스가 초기화 될 때만 기본값이 설정됩니다.

해결책은 기본값을 callable으로 만드는 것입니다.이 경우 함수는 새 인스턴스가 만들어 질 때마다 호출됩니다.

def my_random_key(): 
    return randstr(16) 

class SecretKey(Model): 
    key = CharField(max_length=16, default=my_random_key) 

당신은 물론, 모델의 __init__ 함수의 값을 설정할 수 있지만 callables는 깨끗하고 여전히 model = SecretKey(key='blah') 같은 표준 구문을 사용하여 작동합니다.

+2

나는 앞에서'lambda :'를 치고 호출 가능하도록 만들 수 있겠는가? – mpen

+0

예, 내가 게시 한 후 생각 : –

+0

btw, 나는'F()'인스턴스를 기본값으로 사용하고 싶습니다. 나는 게으르지 않고 http://code.djangoproject.com에 티켓을 채워야합니다 ... 언젠가 – alanjds

관련 문제