Django,适合模型结构

时间:2018-12-04 11:23:56

标签: django django-models

您好,我找不到适合我的模型的数据结构。这些是我的要求:

  • 每个 UserModel 代表一个裁判
  • 裁判队由两名裁判组成
  • 一个比赛可以有一个裁判或一个RefereeTeam
  • 裁判员或裁判员队可以请求任何游戏(进行监督)
  • 每个游戏可以具有任意请求
  • 每场比赛只能有一名指定的裁判或球队
  • 每个请求的
  • 状态(“已拒绝”,“打开”,“已指定”)

我当前的模型无法维护。

------ 在此处编辑 ------ enter image description here

n 游戏请求中,只有一个成为约会。而且如果由于某种原因(生命)约会无效,我需要能够为该特定游戏选择其他GameRequest中的某人。

from django.core.exceptions import ValidationError
from django.db import models
from django.utils.translation import gettext_lazy as _

from django_filters import FilterSet

from users.models import CustomUser # AUTH_MODEL!



class Hall(models.Model):
    """PLACE OF GAME"""
    # details


class team(models.Model):
    name, etc.


class Game(models.Model):
    home = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='home')
    gast = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='team')
    hall = models.ForeignKey(Halle, on_delete=models.CASCADE)
    ...

    def clean(self):
        if self.heim == self.gast:
            raise ValidationError(_("..."))

class RefTeam(models.Model):
    sr1 = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE,
        related_name='gsr1',
        null=True,
        blank=True)
    sr2 = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE,
        related_name='gsr2',
        null=True,
        blank=True)

    class Meta:
        verbose_name_plural = 'Gespanne'

    def clean(self):
        # validation methods


class GameRequest(models.Model):
    game = models.ForeignKey(Spiel, on_delete=models.CASCADE, null=True)
    sr1 = models.ForeignKey(
            CustomUser,
            on_delete=models.CASCADE,
            related_name='sr1',
            null=True,
            blank=True)
    sr2 = models.ForeignKey(
            CustomUser,
            on_delete=models.CASCADE,
            related_name='sr2',
            null=True,
            blank=True)
    refTeam= models.ForeignKey(
            RefTeam,
            on_delete=models.CASCADE,
            null=True,
            blank=True)
    STATI = (
        ('DC', 'Declined'),
        ('OP', 'Open'),
        ('AP', 'Approved')
    status = models.CharField(choices=STATI, max_length=9, default='OP')


    def clean(self):
        # at least sr1, sr2 or team
        # not team and single ref
        # ...


class Appointment(models.Model):
    game = models.OneToOneField(Game, on_delete=models.CASCADE, null=True)
    appointed = models.OneToOneField(GameRequest, on_delete=models.CASCADE, null=True, blank=True)

1 个答案:

答案 0 :(得分:0)

每个UserModel代表一个裁判员

为此,我将使用OneToOne:

class Referee(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )

裁判员团队由两名裁判员组成

为此,我将在裁判上拥有一个ForeignKey和一个模型RefereeTeam

class Referee(models.Model):
        user = models.OneToOneField(
            settings.AUTH_USER_MODEL,
            on_delete=models.CASCADE,
        )
        referee_team = models.ForeignKey(
            RefereeTeam, 
            blank=True, 
            null=True, 
            on_delete=models.DO_NOTHING)

class RefereeTeam(models.Model):
    WHAT YOU WANT FIELDS

也不要忘记RefereeTeam对象与Refereeobj.referee_set具有相反的关系

一个游戏可以有一个裁判或一个RefereeTeam

这有点棘手,但是这里有一个解决方案(不是最好的IMO),它将为您返回RefereeRefereeTeam模型(有关generic relations here的更多信息):

class Game(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

裁判或RefereeTeam可以请求任何比赛(进行监督)

模型与上一个问题相同。

每个游戏可以有任意请求

class Requests(models.Model):
        game = models.ForeignKey(
            Game, 
            blank=False, 
            null=False, 
            on_delete=models.CASCADE)
        request = models.CharField(
            max_length=255, blank=False, 
            null=False)

每场比赛只能有一个指定的裁判或团队 每个请求的状态(“已拒绝”,“打开”,“已指定”)

我真的不了解这个