python - 如何在 Django 中为具有以下关系约束的注册系统建模?
问题描述
我正在尝试使用 Django 创建一个黑客马拉松管理系统 Web 应用程序。每个hackathon可以有尽可能多的参与大学(这里没有限制)。现在,每个参与的大学最多可以有3个团队,每个团队最多可以有4个人(1-4)。我是 Django 新手,非常感谢您的帮助。
from django.db import models
class Hackathon(models.Model):
name = models.CharField(max_length=50,blank=True,default='')
eventId = models.CharField(max_length=50, blank=True, default='')
startDate = models.DateField(null=True)
endDate = models.DateField(null=True)
location = models.TextField(max_length=100, blank=True, default='')
description = models.TextField(max_length=800, blank=True, default='')
#participants = models.ManyToManyField(...)??
def __str__(self):
return self.name
class University(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Team(models.Model):
team_name = models.CharField(max_length=50)
member_count = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(4)])
uni = models.ForeignKey(University, on_delete = models.CASCADE)
def __str__(self):
return self.team_name
class Person(models.Model):
name = models.CharField(max_length=50)
belongs_to = models.ForeignKey(Team,on_delete = models.CASCADE)
解决方案
您的关系模式似乎适合您描述的用例。
您描述的约束(最多 3 个团队,每个团队最多可以有 4 人)不是真正的数据库约束,而是应用程序约束。您可能必须在覆盖您的 Models方法时定义验证逻辑。save()
class Team(models.Model):
def save(self, *args, **kwargs):
if self.uni.teams.count() >= 3:
raise ValidationError("This university already has its 3 teams")
super().save(*args, **kwargs)
class Person(models.Model):
def save(self, *args, **kwargs):
if self.team.persons.count() >= 4:
raise ValidationError("This team already has its 4 people")
super().save(*args, **kwargs)
另外,我建议您使用Django 'User' 模型,它带有几个实用程序:密码管理、用户名唯一性等。