Поле модели Django с установленным значением по умолчанию нарушает ненулевое ограничение при сохранении

Мое поле:

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

Моя ошибка при сохранении:

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

Я пытаюсь сделать простой модульный тест, в котором я создаю связанный экземпляр ModelForm из dict и сохраняю его.

Спасибо.

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.

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()

person Kevin    schedule 02.09.2010    source источник
comment
Можете ли вы опубликовать код фактического теста?   -  person gclj5    schedule 02.09.2010
comment
Не могли бы вы также опубликовать код SignupDataForm? Кстати, это работает: SDF = SignupDataForm(instance=SignupData.objects.create(**tmpDict)) (вместо SDF = SignupDataForm(tmpDict) в цикле for)?   -  person gclj5    schedule 08.09.2010


Ответы (2)


Проблема в вашем коде для меня заключается в том, что вы не должны писать

default=datetime.now()

но вместо

default = datetime.now

передача функции по умолчанию, а не результат функции во время анализа кода. В настоящее время все ваши SignupData будут иметь одну и ту же signup_date.

Тем не менее, я не уверен, что это является причиной вашей ошибки.

person madewulf    schedule 02.09.2010

Убедитесь, что вы действительно используете Django для создания своих объектов. В противном случае вы пропустите всю магию Django для установки значений по умолчанию.

Поэтому используйте что-то вроде этого:

SignupData.objects.create(blah)

Чтобы использовать свой словарь, используйте распаковку словаря:

SignupData.objects.create(**my_dictionary)

Кстати, вы, вероятно, хотите, чтобы параметр по умолчанию был вызываемым, т.е. опускал скобки после функции now. Таким образом, функция будет вызываться каждый раз при создании нового объекта. Со скобками он будет вызываться только один раз, и одно и то же значение будет использоваться для всех вновь созданных объектов.

person gclj5    schedule 02.09.2010