您好,我找不到适合我的模型的数据结构。这些是我的要求:
我当前的模型无法维护。
在 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)
答案 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
对象与Referee
与obj.referee_set
具有相反的关系
一个游戏可以有一个裁判或一个RefereeTeam
这有点棘手,但是这里有一个解决方案(不是最好的IMO),它将为您返回Referee
或RefereeTeam
模型(有关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)
每场比赛只能有一个指定的裁判或团队 每个请求的状态(“已拒绝”,“打开”,“已指定”)
我真的不了解这个