繁体   English   中英

如何在 Django 中使用以下关系约束 model 注册系统?

[英]How do I model a registration system with the following relationship constraints in 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 人)不是真正的数据库约束,而是应用程序约束 您可能必须在覆盖您的模型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' model ,它带有几个实用程序:密码管理、用户名唯一性等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM