Как мне смоделировать систему регистрации со следующими ограничениями отношений в Django? - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь создать веб-приложение системы управления хакатоном, используя Django. В каждом хакатоне может быть как можно больше участвующих университетов (здесь нет ограничений). Теперь в каждом участвующем университете может быть не более 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)

1 Ответ

0 голосов
/ 05 апреля 2020

Ваша реляционная схема кажется подходящей для описанного вами варианта использования.

Описанные вами ограничения ( не более 3 команд и каждая команда может иметь не более 4 человек ) на самом деле не являются ограничения БД а точнее ограничения приложения . Вам, вероятно, придется определить проверочные логи c в переопределении метода 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 Модель «пользователя» , которая поставляется с несколькими утилитами: управление паролями, уникальность имени пользователя, ... et c.

...