即使在删除 Django 中的 OneTone 关系后,UNIQUE 约束也失败了



我的 Django 模型中有一个OneToOneField,即使在尝试保存之前将其删除后,它也UNIQUE constraint failed给了我错误,这里有一个例子:

models.py

class Employee(models.Model):
name = models.CharField(max_length=120)
phone = models.CharField(null=True, blank=True, max_length=20)
salary = models.IntegerField(default=0)
shift = models.OneToOneField(Shift, on_delete=SET_NULL, null=True, blank=True, related_name='employee')
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('employee_details', args=[str(self.id)])

class Shift(models.Model):
branch = models.ForeignKey(Branch, on_delete=CASCADE)
start_time = models.TimeField()
end_time = models.TimeField()
def __str__(self):
return str(self.branch) + ' ( ' + str(self.start_time) + ' / ' + str(self.end_time) + ' )'

forms.py

class AssignEmployeeToShift(forms.Form):
employee = forms.ModelChoiceField(queryset=Employee.objects.filter(shift__isnull=True), widget=forms.Select())

views.py

class EmployeeAssignToShift(SuccessMessageMixin, FormView):
form_class = AssignEmployeeToShift
template_name = 'back_office/employee_assign_to_shift.html'
def get_success_url(self):
return reverse_lazy('branch_details', args=[str(Shift.objects.get(id=self.kwargs['pk']).branch.id)])
def get_context_data(self, **kwargs):
context = super(EmployeeAssignToShift, self).get_context_data(**kwargs)
context['current_shift'] = Shift.objects.get(id=self.kwargs['pk'])
return context
def form_valid(self, form):
shift_object = get_object_or_404(Shift, pk=self.kwargs['pk'])
employee_instance = form.cleaned_data['employee']
employee_object = Employee.objects.filter(shift=shift_object)
if employee_object.count() != 0:
employee_object[0].shift = None
employee_object[0].save()
employee_instance.shift = shift_object
employee_instance.save()
else:
employee_instance.shift = shift_object
employee_instance.save()
return super(EmployeeAssignToShift, self).form_valid(form)

显然,正如错误消息所暗示的那样,至少有两个Employee共享相同的Shift

您的Shift实例已与Employee链接。由于这是一个OneToOneField,这意味着一个班次应该只与一个员工链接,反之亦然。

最新更新