Python IntegrityError:列中的值为空。。Django测试保存方法悖论
我正在为一个允许用户上传文件的视图编写一个附加内容,当我使用Python IntegrityError:列中的值为空。。Django测试保存方法悖论,python,django,django-models,error-handling,save,Python,Django,Django Models,Error Handling,Save,我正在为一个允许用户上传文件的视图编写一个附加内容,当我使用runserver对其进行测试时,它可以在中完美地工作。然而,当我使用Django测试用例时,“created_at”列中的IntegrityError:null值违反了非空约束,其中created_at是一个日期时间字段 class Proposal(IsPrimeMixin, PSortMixin, models.Model): number = models.OneToOneField(ProjectNumber, on_
runserver
对其进行测试时,它可以在中完美地工作。然而,当我使用Django测试用例时,“created_at”列中的IntegrityError:null值违反了非空约束
,其中created_at
是一个日期时间字段
class Proposal(IsPrimeMixin, PSortMixin, models.Model):
number = models.OneToOneField(ProjectNumber, on_delete=models.CASCADE, primary_key=True)
created_at = models.DateTimeField(auto_now_add=True)
...
矛盾之处在于,引发IntegrityError
错误的地方是父保存方法
...
File "/Users/feldman/workspace/intranet/proposals/models.py", line 329, in save
super(Proposal, self).save(*args, **kwargs)
...
但是,此字段应为空,因为auto\u now
字段是在pre\u save
中设置的。当我使用runserver
时会重复这一点<在处创建的code>self.created_在第329行调用父保存方法之前为空。只有在这之后,它才有一个值
> /Users/feldman/workspace/intranet/proposals/models.py(329)save()
(Pdb) self.created_at
(Pdb) next
> /Users/feldman/workspace/intranet/proposals/models.py(330)save()
-> next_number.assigned_at = timezone.now()
(Pdb) next
> /Users/feldman/workspace/intranet/proposals/models.py(331)save()
-> next_number.save()
(Pdb) self.created_at
datetime.datetime(2017, 4, 26, 18, 45, 40, 65870, tzinfo=<UTC>)
模型保存方法的相关部分
def save(self, *args, **kwargs):
log_entry = kwargs.pop('log_entry', True)
if self.pk is None:
next_number = ProjectNumber.objects.next_number()
self.number = next_number
super(Proposal, self).save(*args, **kwargs) # line 329
和回溯
Internal Server Error: /proposals/new
Traceback (most recent call last):
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/core/handlers/exception.py", line 42, in inner
response = get_response(request)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/Users/feldman/workspace/intranet/proposals/views.py", line 66, in proposal_new
proposal.save()
File "/Users/feldman/workspace/intranet/proposals/models.py", line 329, in save
super(Proposal, self).save(*args, **kwargs)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/base.py", line 796, in save
force_update=force_update, update_fields=update_fields)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/base.py", line 824, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/base.py", line 889, in _save_table
forced_update)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/base.py", line 939, in _do_update
return filtered._update(values) > 0
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/query.py", line 654, in _update
return query.get_compiler(self.db).execute_sql(CURSOR)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1148, in execute_sql
cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 835, in execute_sql
cursor.execute(sql, params)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
IntegrityError: null value in column "created_at" violates not-null constraint
DETAIL: Failing row contains (456, null, 2017-04-26 18:59:03.693245+00, Test Case, , null, open, SO, f, PU, null, null, , f, f, f, f, f, f, f, high, 2, null, null, null, null, null, Test City, null, 456.
景色
表单工厂(其中,AForm、BForm、CForm和DForm只是排除
和字段集
的不同组合)
我们很乐意提供更多需要的信息这是一个很好的描述。您还可以粘贴查看功能吗?特别是
proposal\u new
功能。能否粘贴表单中的内容。proposal\u new\u form\u factory
?抱歉,我知道您已经尝试过自己使用Pdb
调试此问题,但我认为答案在于跟踪我们从错误位置返回的步骤。@kiran.koduru我很高兴发布您可以加入的内容?我想这将是一个很长的对话。这是一个很好的描述。您还可以粘贴查看功能吗?特别是proposal\u new
功能。能否粘贴表单中的内容。proposal\u new\u form\u factory
?抱歉,我知道您已经尝试过自己使用Pdb
调试此问题,但我认为答案在于跟踪我们从错误位置返回的步骤。@kiran.koduru我很高兴发布您可以加入的内容?我想这将是一次很长的谈话。
Internal Server Error: /proposals/new
Traceback (most recent call last):
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/core/handlers/exception.py", line 42, in inner
response = get_response(request)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/Users/feldman/workspace/intranet/proposals/views.py", line 66, in proposal_new
proposal.save()
File "/Users/feldman/workspace/intranet/proposals/models.py", line 329, in save
super(Proposal, self).save(*args, **kwargs)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/base.py", line 796, in save
force_update=force_update, update_fields=update_fields)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/base.py", line 824, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/base.py", line 889, in _save_table
forced_update)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/base.py", line 939, in _do_update
return filtered._update(values) > 0
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/query.py", line 654, in _update
return query.get_compiler(self.db).execute_sql(CURSOR)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1148, in execute_sql
cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 835, in execute_sql
cursor.execute(sql, params)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/Users/feldman/.virtualenvs/intranettwopointoh/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
IntegrityError: null value in column "created_at" violates not-null constraint
DETAIL: Failing row contains (456, null, 2017-04-26 18:59:03.693245+00, Test Case, , null, open, SO, f, PU, null, null, , f, f, f, f, f, f, f, high, 2, null, null, null, null, null, Test City, null, 456.
@login_required
def proposal_new(request):
recent_conflict_checks = None
conflict_check = None
has_proposal = False
existing_proposals = None
if request.method == 'POST':
go_no_go = True
prime = True
if 'cancel' in request.POST:
return HttpResponseRedirect(reverse('projects:list'))
if 'conflict_check' in request.POST:
try:
conflict_check = ConflictCheck.objects.get(pk=int(request.POST['conflict_check']))
except ValueError:
pass
else:
go_no_go = conflict_check.is_go_no_go
prime = conflict_check.is_prime
form = forms.proposal_new_form_factory(request.POST, go_no_go=go_no_go, prime=prime)
pdform = forms.ProposalDocumentForm(request.POST, request.FILES, prefix='proposal_docs')
if form.is_valid() and pdform.is_valid():
proposal = form.save(commit=False)
proposal.created_by = request.user.employee
try:
proposal.save() # line 66
except NoProjectNumbers:
messages.error(request, 'No project numbers remain in the database, please contact an administrator.')
else:
...
def choose_base_class(go_no_go, prime):
if go_no_go and prime:
return AForm
elif go_no_go and not prime:
return BForm
elif not go_no_go and prime:
return CForm
elif not go_no_go and not prime:
return DForm
else:
raise ValueError('How did this happen...')
def proposal_new_form_factory(*args, **kwargs):
go_no_go = kwargs.get('go_no_go', True)
prime = kwargs.get('prime', True)
base_class = choose_base_class(go_no_go, prime)
class ProposalNewForm(base_class):
class Meta(base_class.Meta):
# Add status to exclude
base_class.Meta.exclude.append('status')
# Add description for demographics and marketing fieldset
fieldsets = deepcopy(base_class.Meta.fieldsets)
marketing_fieldset = filter(lambda x: x[0] == 'Demographics and Marketing', fieldsets)[0]
marketing_index = fieldsets.index(marketing_fieldset)
fieldsets[marketing_index][1]['description'] = ('Either city or state is required for a new proposal.')
return ProposalNewForm(*args, **kwargs)