2009-06-12 8 views
0

사용자 정의 타임 스탬프 필드를 만들려고합니다.Django : 타임 스탬프 문자열 사용자 정의 필드

class TimestampKey(models.CharField): 
    __metaclass__ = models.SubfieldBase 

    def __init__(self, *args, **kwargs): 
     import time 

     kwargs['unique'] = True 
     kwargs['max_length'] = 20 
     kwargs['auto_created'] = True 
     kwargs['editable']=False 
     super(TimestampKey, self).__init__(*args, **kwargs) 

    def to_python(self, value) : 
     return value 

    def get_db_prep_value(self, value) : 
     try: 
      import time 
      t = time.localtime() 
      value = reduce(lambda a,b:str(a)+str(b),t) 
     except ValueError: 
      value = {} 

     return value 


class Table1(models.Model): 
     f = TimestampKey(primary_key=True) 
     n = .... 

적절한 시간 소인과 함께 값을 db에 저장합니다. 하지만 그것은 개체의 필드 'f'를 채우지 않습니다.

예는 :

t1 = Table1(n="some value") 
t1.f -> blank 

t1.save() 

t1.f -> blank. 

이 문제입니다. 나는 그것이 제출 된 것을 채울 수 없도록 뭔가를 놓치고 있습니까? 이것에 대해 밝히십시오.

감사합니다.

답변

1

get_db_prep_value 메서드는 데이터베이스에 대한 값만 준비하지만 준비된 값을 어떤 식 으로든 파이썬 개체로 보내지 않습니다. 이를 위해서는 pre_save 메서드가 필요하다고 생각합니다.

다행히도 pre_save을 사용하여 원하는대로 수행하는 DateField 및 DateTimeField에 이미 "auto_now"옵션이 있습니다. 시도 :

class Table1(models.Model): 
    f = models.DateTimeField(auto_now=True) 

을 (당신이 당신의 자신의 pre_save를 작성해야하는 경우, 선 486-492에 /django/db/models/fields/__init__.pyauto_now 실제 모델 인스턴스를 수정하는 방법에 대해 살펴 :

def pre_save(self, model_instance, add): 
    if self.auto_now or (self.auto_now_add and add): 
     value = datetime.datetime.now() 
     setattr(model_instance, self.attname, value) 
     return value 
    else: 
     return super(DateField, self).pre_save(model_instance, add) 

)

+0

감사합니다. krubo. 이것은 실제로 나를 도왔다. – MSW

3

그것을 현명하다 타임 스탬프를 기본 키로 사용 하시겠습니까? 데이터베이스가 ISO 8601을 사용하거나 실제로 두 번째 시간 간격이 가장 작은 시간 형식을 사용하는 경우 ... 음, 어쨌든, 요점은 당신이 보장 할 수 없다는 것입니다. 특히 이것이 웹에 적용되는 응용 프로그램 인 경우 엔 두 항목 최소 시간 간격 내에 해결 될 것입니다. 즉, ISO 8601에서와 같이 최소 시간 간격이 1 초인 경우 동일한 초에 두 번 저장하라는 요청을 받으면 오류 상태가 발생합니다. 자동으로 정수 키를 증가시키고 타임 스탬프 자체 필드를 만드는 것이 어떻습니까?

+0

Date()로 사용하면 맞습니다. 하지만 전체 타임 스탬프를 VARCHAR로 사용할 계획입니다. 코드를 살펴보면 튜플을 문자열로 축소하고 있음을 알 수 있습니다. 그래서, shouldnt는 문제 일 것입니다. – MSW

+0

+1 Django는 기본 키를 자동으로 수행합니다. 중요한 이유가있는 경우에만 기본 키를 설정해야합니다. – krubo