Skip to main content
 首页 » 编程设计

python之如何处理 Django 元类中的 UniqueConstraint 失败

2024年11月24日27itcoder

我为我的模型创建了一个 UniqueConstraint 元类,当我通过有意创建一个副本来测试它时它可以工作,但我得到一个错误页面而不是被重定向回原始页面。在哪里插入代码以返回到我刚才所在的页面?

我认为问题出在 View 中,但我不知道应该在其中放入什么代码,而且 Django 文档中没有任何内容暗示这个问题。

型号:

class StudentScheduledClass(models.Model): 
    student = models.ForeignKey("users.User", on_delete=models.CASCADE, db_column="Student") 
    scheduled_class = models.ForeignKey("ScheduledClass", on_delete=models.CASCADE, db_column="ScheduledClass") 
    grade = models.FloatField(db_column="Grade", blank=True, null=True) 
 
    class Meta: 
        managed = True 
        db_table = "StudentScheduledClass" 
        verbose_name_plural = "StudentsScheduledClasses" 
        constraints = [ 
            models.UniqueConstraint(fields=['student', 'scheduled_class'], name='student scheduled class restraint') 
        ] 

查看:

class StudentScheduledClassCreateView(LoginRequiredMixin, CreateView): 
    model = StudentScheduledClass 
    context_object_name = "student_scheduled_class" 
    fields = ["student"] 
 
    def form_valid(self, form): 
        scheduled_class = self.kwargs["scheduled_class"] 
        form.instance.scheduled_class = ScheduledClass(scheduled_class) 
        return super().form_valid(form) 
 
    def get_success_url(self): 
        scheduled_class = self.kwargs["scheduled_class"] 
        return reverse("scheduled-class-detail", args={scheduled_class}) 

我只想返回带有错误消息的原始页面,但我收到了此完整性错误:

IntegrityError at /classes/student_scheduled_class_create/1/ 
UNIQUE constraint failed: StudentScheduledClass.Student, StudentScheduledClass.ScheduledClass 
Request Method: POST 
Request URL:    http://localhost:8000/classes/student_scheduled_class_create/1/ 
Django Version: 2.2.2 
Exception Type: IntegrityError 
Exception Value:     
UNIQUE constraint failed: StudentScheduledClass.Student, StudentScheduledClass.ScheduledClass 

请您参考如下方法:

您的表单只需要字段 student所以它是有效的,因为你没有给它的实例一个 scheduled_class 的值当它得到验证时。

您应该使用 instance 初始化您的表单为此 scheduled_class已经设置。你可以在 get_form_kwargs() 中做到这一点或者,因为该方法通过了 self.object作为instance , 你可以在 post() 中更简单地做到这一点:

def post(self, request, *args, **kwargs): 
    self.object = StudentScheduledClass(scheduled_class=kwargs['scheduled_class']) 
    return super().post(request, *args, **kwargs) 

或者,虽然不太干净(我喜欢认为一旦 form_valid() 被调用,一切都应该没问题):

def form_valid(self, form): 
    scheduled_class = self.kwargs["scheduled_class"] 
    form.instance.scheduled_class = ScheduledClass(scheduled_class) 
    try: 
        return super().form_valid(form) 
    except IntegrityError: 
        return self.form_invalid(form) 

最后一个问题是表单不会显示任何错误,因此您可能希望向 self.request 添加 Django 消息在返回之前(假设您在模板中显示任何消息)。