2009-06-12 75 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 = .... 

它將適當的時間戳值存儲在數據庫中。但它不填充對象中的字段'f'。

如:

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

t1.save() 

t1.f -> blank. 

這就是問題所在。我是否錯過了一些東西,以便它不填充該字段? 請在此闡明一些。

謝謝。

回答

1

get_db_prep_value方法只爲數據庫準備一個值,但不會以任何方式將準備好的值發送回Python對象。爲此,我認爲你需要pre_save方法。

幸運的是,DateField和DateTimeField上已有一個「auto_now」選項,它使用pre_save來做你想做的事。嘗試:

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

(如果你必須編寫自己的pre_save,看看如何auto_now修改實際模型實例在/django/db/models/fields/__init__.py上線486-492:

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 2009-06-13 01:46:21

3

是否明智使用時間戳作爲主鍵?如果你的數據庫使用ISO 8601或任何時間格式,其中第二個是最小的時間間隔......好吧,無論如何,我的觀點是你沒有保證,特別是如果這將是一個面向網絡的應用程序,兩個條目將在最短的時間間隔內解決。也就是說,如果最小的時間間隔是一秒鐘,就像在ISO 8601中一樣,如果你在同一秒內得到兩個保存請求,你將會得到一個錯誤條件。爲什麼不堅持自動遞增整數鍵,只是將時間戳設置爲自己的字段?

+0

是的,如果我將它用作日期(),那麼你是對的。但是我打算將整個時間戳用作VARCHAR。如果你看看代碼,你可能會看到我正在將元組縮減爲一個字符串。所以,不應該是一個問題。 – MSW 2009-06-13 01:47:36