2010-09-02 35 views
5

我場空約束:使用默認值設置的Django模型字段不違反保存時

signup_date = models.DateTimeField(blank=True,default=datetime.now) 

我的救命時錯誤:

IntegrityError: null value in column "signup_date" violates not-null constraint 

我試圖做一個簡單的單元測試,我從字典中創建一個ModelForm的綁定實例並保存。

謝謝。

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/django/signupform/signup/insert_test_data.py", line 27, in <module> 
    SDF.save() 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/forms/models.py", line 371, in save 
    fail_message, commit, construct=False) 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/forms/models.py", line 86, in save_instance 
    instance.save() 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/base.py", line 435, in save 
    self.save_base(using=using, force_insert=force_insert, force_update=force_update) 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/base.py", line 528, in save_base 
    result = manager._insert(values, return_id=update_pk, using=using) 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/manager.py", line 195, in _insert 
    return insert_query(self.model, values, **kwargs) 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/query.py", line 1479, in insert_query 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/sql/compiler.py", line 783, in execute_sql 
    cursor = super(SQLInsertCompiler, self).execute_sql(None) 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/sql/compiler.py", line 727, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/backends/util.py", line 15, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute 
    return self.cursor.execute(query, args) 
IntegrityError: null value in column "signup_date" violates not-null constraint 




from django.db import models 
from django.contrib.localflavor.us.models import PhoneNumberField 
from datetime import datetime 
from models_dropdowns import * 

class SignupData(models.Model): 
    first_name = models.CharField(max_length=128,verbose_name='First Name') 
    last_name = models.CharField(max_length=128,verbose_name='Last Name') 
    street1 = models.CharField(max_length=128,verbose_name='Street Address 1') 
    street2 = models.CharField(max_length=128,verbose_name='Street Address 2') 
    city = models.CharField(max_length=128) 
    state = models.CharField(max_length=2) 
    zip = models.IntegerField(verbose_name='Zip Code') 
    phone_number = PhoneNumberField(verbose_name='Phone Number XXX-XXX-XXXX') 
    email = models.EmailField(verbose_name='Email Address') 
    contact_method = models.ForeignKey('ContactMethodChoice',blank=False,default=-1,verbose_name='Preferred contact method') 
    birth_date = models.DateField(verbose_name='Birth Date') 
    policy_number = models.CharField(max_length=128,verbose_name='American Family Auto Insurance Policy Number') 
    vin = models.CharField(max_length=128,verbose_name='Vehicle Identification Number (VIN)') 
    vehicle_make = models.ForeignKey('VehicleMakeChoice',verbose_name='VehicleMake') 
    vehicle_model = models.CharField(max_length=128,verbose_name='Vehicle Model') 
    vehicle_year = models.ForeignKey('VehicleYearChoice',verbose_name='Vehicle Year') 
    vehicle_ownership = models.ForeignKey('VehicleOwnershipChoice',blank=False,default=-1,verbose_name='Vehicle Ownership') 
    vehicle_use = models.ForeignKey('VehicleUseChoice',blank=False,default=-1,verbose_name='Use of Vehicle') 
    terms_and_conditions = models.BooleanField(verbose_name='I Agree to the terms and conditions. (add link)') 
    form_user_role = models.ForeignKey('FormUserRoleChoice',blank=False,default=-1,verbose_name='Your Role') 
    participate_in_feedback = models.BooleanField(verbose_name='<b>Opportunity to provide feedback.</b>...<br><br>',help_text='Please check the box if you would like to participate.') 
    signup_date = models.DateTimeField(blank=True,default=datetime.now,verbose_name='') 

我用下面的代碼來創建窗體綁定實例,並保存它。我通過從./manage.py shell中導入它來運行它。

from signupform.signup.forms import SignupDataForm 

keys =  ('first_name','last_name','street1','street2','city','state','zip','phone_number','email','contact_method','birth_date','policy_number','vin','vehicle_make','vehicle_model','vehicle_year','vehicle_ownership','vehicle_use','terms_and_conditions','form_user_role','participate_in_feedback') 

data = [ 
('firstname1','lastname1','test1','test1','test1','XX',55555,'555-555-5555','[email protected]',1,'01/01/01','####-####-##-##-AAAA-AA','123456789abcdefgh',1,'model',1996,1,1,True,1,True), 
('firstname2','lastname2','test2','test2','test2','XX',55555,'555-555-5555','[email protected]',1,'01/01/01','####-####-##-##-AAAA-AA','123456789abcdefgh',1,'model',1996,1,1,True,1,True), 
('firstname3','lastname3','test3','test3','test3','XX',55555,'555-555-5555','[email protected]',1,'01/01/01','####-####-##-##-AAAA-AA','123456789abcdefgh',1,'model',1996,1,1,True,1,True), 
('firstname4','lastname4','test4','test4','test4','XX',55555,'555-555-5555','[email protected]',1,'01/01/01','####-####-##-##-AAAA-AA','123456789abcdefgh',1,'model',1996,1,1,True,1,True), 
] 

for d in data: 
    tmpDict = {} 
    for i in range(0,len(keys)): 
     tmpDict[keys[i]] = d[i] 
    SDF = SignupDataForm(tmpDict) 
    if not SDF.is_valid(): 
     print SDF.errors 
    else: 
     SDF.save() 
+0

你可以發佈實際測試的代碼嗎? – gclj5 2010-09-02 16:41:26

+0

已發佈。 – Kevin 2010-09-04 07:53:01

+0

你可能也可以發佈SignupDataForm的代碼嗎?順便說一句,這是否工作:SDF = SignupDataForm(實例= SignupData.objects.create(** tmpDict))(而不是SDF = SignupDataForm(tmpDict)在for循環中)? – gclj5 2010-09-08 19:17:07

回答

0

確保你實際使用Django來創建你的對象。否則,你會繞過所有的Django魔法來設置默認值。

因此,使用這樣的事情:

SignupData.objects.create(blah) 

要使用你的字典,使用字典拆包:

SignupData.objects.create(**my_dictionary) 

順便說一句,你可能想的默認參數是一個可調用,即省略括號now函數之後。這樣,每次創建新對象時都會調用該函數。使用parens它只會被調用一次,並且所有新創建的對象都會使用相同的值。

2

在你我的代碼的問題是,你不應該寫

default=datetime.now() 

而是

default = datetime.now 

傳遞函數爲默認值,而不是函數的結果在當時的代碼被解析。目前,您所有的SignupData都會有相同的註冊日期。

也就是說,我不確定這是否是您的錯誤的原因。

相關問題