2010-09-02 13 views
5

lĩnh vực của tôi:Django mô hình lĩnh vực với các thiết lập giá trị mặc định là vi phạm không hạn chế null khi lưu

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

My lỗi khi lưu:

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

Tôi đang cố gắng để thực hiện một thử nghiệm đơn vị đơn giản mà tôi tạo một thể hiện ràng buộc của một ModelForm từ một dict và lưu nó.

Cảm ơn.

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='') 

Tôi sử dụng mã sau để tạo một phiên bản ràng buộc của biểu mẫu và lưu nó. Tôi chạy điều này bằng cách nhập nó từ ./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

Bạn có thể đăng mã của thử nghiệm thực tế không? – gclj5

+0

nó đã được đăng. – Kevin

+0

Có thể bạn cũng có thể đăng mã của SignupDataForm? BTW, hiện công việc này: SDF = SignupDataForm (ví dụ = SignupData.objects.create (** tmpDict)) (thay vì SDF = SignupDataForm (tmpDict) trong vòng lặp for của bạn)? – gclj5

Trả lời

0

Đảm bảo bạn đang thực sự sử dụng Django để tạo đối tượng của mình. Nếu không, bạn bằng cách vượt qua tất cả ma thuật Django để thiết lập các giá trị mặc định.

Vì vậy, sử dụng một cái gì đó như thế này:

SignupData.objects.create(blah) 

Để sử dụng từ điển của bạn, sử dụng giải nén từ điển:

SignupData.objects.create(**my_dictionary) 

BTW, có thể bạn muốn tham số mặc định là một callable, tức là bỏ qua các dấu ngoặc sau hàm now. Bằng cách này, hàm sẽ được gọi mỗi khi một đối tượng mới được tạo ra. Với các parens nó sẽ chỉ được gọi một lần và cùng một giá trị sẽ được sử dụng cho tất cả các đối tượng mới được tạo ra.

2

On vấn đề trong bạn mã đối với tôi là bạn không nên viết

default=datetime.now() 

nhưng thay vì

default = datetime.now 

đi qua các chức năng như mặc định và không phải là kết quả của hàm đồng thời mã được phân tích cú pháp. Hiện tại, tất cả SignupData của bạn sẽ có cùng một lần đăng ký

Điều đó nói rằng, tôi không chắc chắn rằng đây là nguyên nhân gây ra lỗi của bạn.

Các vấn đề liên quan