如何在 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】:您可以覆盖模型 Registration 的save()
方法,以便在数据库中已有同名和注册号的学生时进行验证并引发异常。
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 用户密码?