2

首先,我必须承认我对所有这些编码的东西都很陌生,但是因为我自己找不到合适的解决方案,所以学习编码可能是最好的方法。

无论如何,我正在尝试构建一个应用程序来展示不同的冠军、冠军和类似的东西。在阅读了 Django 文档后,我发现我必须使用中间模型作为更好的方法。我的旧 models.py 看起来像这样:

class Person(models.Model):
    first_name = models.CharField(max_length=64)
    last_name = models.CharField(max_length=64)
    [...]

class Team(models.Model):
    name = models.CharField(max_length=64)
    team_member_one = models.ForeignKey(Person)
    team_member_two = models.ForeignKey(Person)

class Championship(models.Model):
    name = models.CharField(max_length=128)
    status = models.BooleanField(default=True)

class Titleholder(models.Model):
    championship = models.ForeignKey(Championship)
    date_won = models.DateField(null=True,blank=True)
    date_lost = models.DateField(null=True,blank=True)
    titleholder_one = models.ForeignKey(Person,related_name='titleholder_one',null=True,blank=True)
    titleholder_two = models.ForeignKey(Person,related_name='titleholder_two',null=True,blank=True)

个人或团队都可以赢得冠军,这取决于是单打冠军还是团体冠军,这就是为什么我必须在 Titleholder 类中使用外键。查看Django 文档,这似乎是错误的。另一方面,对于作为初学者的我来说,示例中的中间模型似乎不适合我的模型。

长话短说:谁能指出我如何以正确的方式构建模型的正确方向?注意:这只是一个关于如何构建模型并在 Django 管理中显示它的问题,我什至现在还没有谈论构建模板。

帮助将不胜感激!提前谢谢各位。

4

1 回答 1

0

所以我会从头开始。您似乎对 ER 数据库建模有些陌生。如果我试图做你所做的事情,我会按照以下方式创建我的模型。

首先,Team 将成为我的“角落”模型(我用这个术语表示没有任何 FK 字段的模型),然后 Person 模型将发挥作用,如下所示。

class Team(models.Model):
    name = models.CharField(max_length=64)

class Person(models.Model):
    first_name = models.CharField(max_length=64)
    last_name = models.CharField(max_length=64)
    team = models.ForeignKey(to=Team, null=True, blank=True, related_name='members')

这有效地使模型具有可扩展性,即使您的团队中永远不会有超过两个人,这也是一种很好的做法。

接下来是冠军模型。我会将此模型与 Person 模型直接连接为与“通过”模型的多对多关系,如下所示。

class Championship(models.Model):
    name = models.CharField(max_length=64)
    status = models.BooleanField(default=False) # This is not a great name for a field. I think should be more meaningful.
    winners = models.ManyToManyField(to=Person, related_name='championships', through='Title')

class Title(models.Model):
    championship = models.ForeignKey(to=Championship, related_name='titles')
    winner = models.ForeignKey(to=Person, related_name='titles')
    date = models.DateField(null=True, blank=True)

根据我的理解,这正是我会做的方式。我敢肯定我不明白你试图做的一切。随着我的理解发生变化,我可能会修改这些模型以适应我的需要。

可以采取的另一种方法是使用 GenericForeignKey 字段来创建一个字段,该字段可以是 Team 模型或 Person 模型的 FK。或者可以更改的另一件事可能是您添加另一个模型来保存每次举行冠军赛的详细信息。有很多方法可以解决它,没有一种正确的方法。

让我知道您是否有任何问题,或者我没有处理过的任何事情。我会尝试根据需要修改答案。

于 2016-05-04T08:04:35.163 回答