如何在 Django Rest Framework 中编写涉及两个模型的业务逻辑

Posted

技术标签:

【中文标题】如何在 Django Rest Framework 中编写涉及两个模型的业务逻辑【英文标题】:How to write a business logic involving two models in Django Rest Framework 【发布时间】:2019-09-03 18:58:24 【问题描述】:

我很困惑,不知道如何在 django 和 django rest 框架中编写业务逻辑。

创建学生时如何验证注册中不存在的学生(registration_no会通过前端提供,会包含在json中)表中?

class Student(models.Model):
    name = models.CharField(max_length=300)
    sex  = models.CharField(choices=SEX_CHOICES,max_length=255, null=True)
    Category = models.CharField(max_length=100, null=True)


    def __str__(self):
        return self.name

注册模型

class Registration(models.Model):
    registration_no = models.CharField(max_length=255, unique=True)
    student = models.ForeignKey(Student, 
    on_delete= models.CASCADE, related_name='registrations')

    def __str__(self):
        return self.registration_no

【问题讨论】:

您想在注册时检查用户是否已经创建? 我想检查创建学生时是否已经存在具有相同注册号的学生姓名。 【参考方案1】:

您可以覆盖模型 Registrationsave() 方法,以便在数据库中已有同名和注册号的学生时进行验证并引发异常。

class Registration(models.Model):
    registration_no = models.CharField(max_length=255, unique=True)
    student = models.ForeignKey(Student, 
    on_delete= models.CASCADE, related_name='registrations')

    def __str__(self):
        return self.registration_no

    def save(self, *args, **kwargs):
        try:
            Registration.objects.get(student__name=self.name, registration_no=self.registration_no)
        except:
            super(Registration, self).save(*args, **kwargs)
        else:
            raise Exception("Student already registered")

【讨论】:

我想从前端传递 (name, registration_no)。因此将使用这两个参数进行检查 对不起,但我认为我的回答已经检查了这些参数。 能否上传完整的实现 我无法上传完整的实现,因为我不知道您正在使用的前端实现,但我很确定,无论是什么,您都在发送 POST 请求从前端到后端,因此后端必须通过 Django view 捕获此类请求并执行创建尝试。像registration = Registration.objects.create(registration_no=registration_no, student=student) 这样的东西。这足以触发保存验证。

以上是关于如何在 Django Rest Framework 中编写涉及两个模型的业务逻辑的主要内容,如果未能解决你的问题,请参考以下文章

Django.rest_framework:如何序列化一对多?

如何使用 TemplateHTMLRenderer 在 Django-REST-Framework 中创建/放置?

django-rest-framework:如何序列化已经包含 JSON 的字段?

如何在 Django Rest Framework 中散列 Django 用户密码?

如何仅使用 django 作为后端并使用 django-rest-framework 发布

如何在 React 中显示来自 django-rest-framework 的错误消息