首页 > 解决方案 > “NOT NULL 约束失败:small_small_hr_staffprofile.data”

问题描述

尝试提交 modelForm 时出现此错误。由于约束,问题似乎在于将表单保存到 sqlite3 中。如果有人可以帮我挑选出来,请。在此先感谢以下是我的视图和模型的代码。

IntegrityError at /admin/small_small_hr/staffprofile/add/
NOT NULL constraint failed: small_small_hr_staffprofile.data
Request Method: POST
Request URL:    http://localhost:8000/admin/small_small_hr/staffprofile/add/
Django Version: 2.2
Exception Type: IntegrityError
Exception Value:    
NOT NULL constraint failed: small_small_hr_staffprofile.data
Exception Location: C:\Users\hp\Anaconda3\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 383
Python Executable:  C:\Users\hp\Anaconda3\python.exe
Python Version: 3.7.4

看法:

@user_passes_test(lambda u: u.is_superuser)
def CreateStaff(request):
    if request.method == 'POST':
        form = StaffProfileAdminCreateForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, f'Staff created successfully')
            return redirect('home')
    else:
        form = StaffProfileAdminCreateForm()
    return render(request, 'small_small_hr/create-staff.html', {'form': form})

模型:

class StaffProfile(TimeStampedModel, models.Model):
    """
    StaffProfile model class
    Extends auth.User and adds more fields
    """
    NOT_KNOWN = '0'
    MALE = '1'
    FEMALE = '2'
    NOT_APPLICABLE = '9'

    SEX_CHOICES = (
        (NOT_KNOWN, _('Not Known')),
        (MALE, _('Male')),
        (FEMALE, _('Female')),
        (NOT_APPLICABLE, _('Not Applicable'))
    )

    user = models.OneToOneField(
        USER, verbose_name=_('User'), on_delete=models.CASCADE)
    image = ImageField(upload_to="profile_pics", max_length=255,
                       verbose_name=_("Profile Image"),
                       help_text=_("A square image works best"), blank=True)
    sex = models.CharField(_('Gender'), choices=SEX_CHOICES, max_length=1,
                           default=NOT_KNOWN, blank=True, db_index=True)
    role = models.ForeignKey(Role, verbose_name=_('Role'), blank=True,
                             default=None, null=True,
                             on_delete=models.SET_NULL)
    phone = PhoneNumberField(_('Phone'), blank=True, default='')
    address = models.TextField(_('Addresss'), blank=True, default="")
    birthday = models.DateField(_('Birthday'), blank=True, default=None,
                                null=True)
    leave_days = models.PositiveIntegerField(
        _('Leave days'), default=21, blank=True,
        help_text=_('Number of leave days allowed in a year.'))
    sick_days = models.PositiveIntegerField(
        _('Sick days'), default=10, blank=True,
        help_text=_('Number of sick days allowed in a year.'))
    overtime_allowed = models.BooleanField(
        _('Overtime allowed'), blank=True, default=False)
    start_date = models.DateField(
        _('Start Date'), null=True, default=None, blank=True,
        help_text=_('The start date of employment'))
    end_date = models.DateField(
        _('End Date'), null=True, default=None, blank=True,
        help_text=_('The end date of employment'))
    data = JSONField(_('Data'), default=dict, blank=True)

    class Meta:  # pylint: disable=too-few-public-methods
        """
        Meta options for StaffProfile
        """
        abstract = False
        verbose_name = _('Staff Profile')
        verbose_name_plural = _('Staff Profiles')
        ordering = ['user__first_name', 'user__last_name', 'user__username',
                    'created']

    def get_name(self):
        """
        Returns the staff member's name
        """
        # pylint: disable=no-member
        return f'{self.user.first_name} {self.user.last_name}'

    def get_approved_leave_days(self, year: int = datetime.today().year):
        """
        Get approved leave days in the current year
        """
        # pylint: disable=no-member
        return get_taken_leave_days(
            staffprofile=self,
            status=Leave.APPROVED,
            leave_type=Leave.REGULAR,
            start_year=year,
            end_year=year
        )

    def get_approved_sick_days(self, year: int = datetime.today().year):
        """
        Get approved leave days in the current year
        """
        return get_taken_leave_days(
            staffprofile=self,
            status=Leave.APPROVED,
            leave_type=Leave.SICK,
            start_year=year,
            end_year=year
        )

    def get_available_leave_days(self, year: int = datetime.today().year):
        """
        Get available leave days
        """
        try:
            # pylint: disable=no-member
            leave_record = AnnualLeave.objects.get(
                leave_type=Leave.REGULAR,
                staff=self,
                year=year)
        except AnnualLeave.DoesNotExist:
            return Decimal(0)
        else:
            return leave_record.get_available_leave_days()

    def get_available_sick_days(self, year: int = datetime.today().year):
        """
        Get available sick days
        """
        try:
            # pylint: disable=no-member
            leave_record = AnnualLeave.objects.get(
                leave_type=Leave.SICK,
                staff=self,
                year=year)
        except AnnualLeave.DoesNotExist:
            return Decimal(0)
        else:
            return leave_record.get_available_leave_days()

    def __str__(self):

        return self.get_name()

标签: pythondjango

解决方案


你有这个,它允许 "" 但不允许NULL

data = JSONField(_('Data'), default=dict, blank=True)

您要么需要允许NULL

data = JSONField(_('Data'), default=dict, blank=True, null=True)

或者确保数据永远不会null出现在您的代码中。


推荐阅读