繁体   English   中英

Django引发IntegrityError:UNIQUE约束在单元测试中失败

[英]Django raises IntegrityError: UNIQUE constraint failed in unit test

当我尝试在test.py或shell界面中创建Timesheet对象时,出现完整性错误。 但是,我可以通过提供的html接口创建对象。 错误,模型,视图和表格如下。

任何想法或建议,将不胜感激。

错误:

    Traceback (most recent call last):
  File "<console>", line 5, in <module>
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/models/query.py", line 399, in create
    obj.save(force_insert=True, using=self.db)
  File "/Users/Development/et/timesheets/models.py", line 222, in save
    return super(Timesheet, self).save(*args, **kwargs)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/models/base.py", line 796, in save
    force_update=force_update, update_fields=update_fields)
  File "/Users/Development/venvs/venv-2017-01/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/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/models/base.py", line 908, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/models/base.py", line 947, in _do_insert
    using=using, raw=raw)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/models/query.py", line 1045, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1054, in execute_sql
    cursor.execute(sql, params)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/Development/venvs/venv-2017-01/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 337, in execute
    return Database.Cursor.execute(self, query, params)
IntegrityError: UNIQUE constraint failed: timesheets_timesheet.id

楷模:

class Timesheet(models.Model):
    owner = models.ForeignKey(User, editable=False)

    employee = models.CharField(
        max_length=30,
        help_text='Name of the employee that did the work'
    )

    company = models.CharField(
        max_length=30,
        help_text = 'Name of the company that will pay for the invoice'
    )

    date = models.DateField(help_text='Week-End Date (Sunday)', validators=[validate_sunday])

    ...Other model fields...

    secret = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)


    ...Other model functions...

    def save(self, *args, **kwargs):
        self.full_clean()

        if self.pk is None:
            super(Timesheet, self).save(*args, **kwargs)
            self.create_time_entries()
        else:
            self.update_hours()
        return super(Timesheet, self).save(*args, **kwargs)

观看次数:

class TimesheetCreate(LoginRequiredMixin, CreateView):
    model = Timesheet
    template_name = 'timesheet.html'
    form_class = TimeSheetForm

    def form_valid(self, form):
        form.instance.owner = self.request.user
        return super(TimesheetCreate, self).form_valid(form)

    def get_success_url(self):
        return reverse('TimeEntryUpdate', args=(self.object.pk,))

形式:

class TimeSheetForm(forms.ModelForm):
    employee = forms.CharField(label='Name',
                               widget=forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'Your Name'}))
    company = forms.CharField(label='Company',
                              widget=forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'Company'}))
    date = forms.DateField(label='Date',
                           input_formats=date_formats,
                           widget=forms.DateInput(format='%d %B, %Y', attrs={'class' : 'form-control datepicker-sunday-only', 'placeholder' : 'Week-end Date (Sunday)'}),
                           error_messages={'invalid': 'Date must be a Sunday!'})

    class Meta:
        model = Timesheet
        fields = ['employee', 'company', 'date']
        exclude = ['owner', 'secret', 'employer_name', 'employer_email']

    def __init__(self, *args, **kwargs):
        super(TimeSheetForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance.status in ('1','2','3',) :
            self.fields['employee'].widget.attrs['readonly'] = True
            self.fields['company'].widget.attrs['readonly'] = True
            self.fields['date'].widget.attrs['readonly'] = True

您两次调用保存方法,编辑保存方法,

def save(self, *args, **kwargs):
    self.full_clean()

    if self.pk is None:
        super(Timesheet, self).save(*args, **kwargs)
        self.create_time_entries()
    else:
        self.update_hours()
        super(Timesheet, self).save(*args, **kwargs)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM