2010-10-26 79 views
1

我有一個模型,其中有幾個「自動」的字段,如:忽略域「保存」在Django

class Message(Model): 
    subject = CharField(max_length = 200) 
    message = TextField() 
    created = DateTimeField() 
    last_status_change = DateTimeField() 
    status = CharField(max_length = 10) 

在我的數據庫(Postgres的),我設置了默認值created, last_status_change, status也,我設置了觸發器來更新last_status_change,每次更改status

然而,當我嘗試創建和保存這樣的模型實例:

m = Message(subject = 'Hello', message = 'Long and boring day') 
m.save() 

的Django試圖插入空值到這些丟失的領域,這是不對的。有沒有辦法讓它在沒有這些字段的情況下發出插入,還是我必須在代碼中複製我的數據庫功能?

謝謝!

+0

你去哪裏把默認字段的值?模型中沒有設置默認值。 – 2010-10-26 12:12:56

+0

@anand他們設置在數據庫級別 – 2010-10-26 12:15:38

+0

@maksymko在模型類中設置它們。有一個參數'default'可以設置爲默認值。看看這個:http://docs.djangoproject.com/en/dev/ref/models/fields/ – 2010-10-26 12:17:15

回答

0

我建議您將默認值放入模型字段定義中,並實現更改狀態的特殊方法或重寫save()方法而不是數據庫級觸發器。

1

你可以嘗試以下。就像空白設置爲true ......

class Message(Model): 
    subject = CharField(max_length = 200) 
    message = TextField(blank=True,null=True) 
    created = DateTimeField(auto_now=True) 
    last_status_change = DateTimeField(auto_now=True) 
    status = CharField(max_length = 10,blank=True,null=True) 

    def save(self): 
     self.last_status_change=Datetime.now() 


+0

空白嘗試將狀態設置爲空字符串,這是無效狀態。從我看到的,只有沒有辦法做我想在Django ... – 2010-10-27 07:32:59

+0

嘗試並在模型中添加一個方法,它將自我作爲第一個參數,並按照您希望的方式處理狀態。 – mossplix 2010-10-27 08:52:03

0

可以省略上更新字段,但上插入(設計)。

如果您想將日期時間字段設置爲一個日期(即datetime.now),你也可以傳遞一個可調用的缺省參數,並注意設置UTC時間的(或任何你想要的)自己:

ctime = models.DateTimeField(default=datetime.datetime.utcnow) 

上述操作會在保存新行時自動插入當前日期和時間(utc)作爲ctime字段值。

編輯:剛纔看到你也在尋找設置修改時間,你可以確保你的代碼運行完全按照你想要的,並避免與pre_save signal hook一個額外的更新:

from django.db.models.signals import pre_save 
from django.dispatch import receiver 
from myapp.models import MyModel 

@receiver(pre_save, sender=MyModel) 
def update_mtime(sender, instance, **kwargs): 
    instance.mtime = datetime.datetime.utcnow()