2

前言:我是 django 和 db 设计的新手。

超级编辑:我做了一些重大的改变,所以我的改变之前的答案可能会引用不在这里的东西。我道歉。

我会直接看代码:models.py:

class Player(models.Model):
    name = models.CharField()

class Team(models.Model):
    name = models.CharField()
    members = models.ManyToManyField(Player, through='Membership')

class Word(models.Model):
    word = models.CharField(unique=True)
    definition = models.CharField()
    ...

class Ownership(models.Model):
    owner = models.ForeignKey(Player)
    team = models.ForeignKey(Team)
    word = models.ForeignKey(Word)

class Membership(models.Model):
    team = models.ForeignKey(Team)
    player = models.ForeignKey(Player)

Word 表已被填充。在管理员中,我创建了一个播放器。然后我创建一个团队并向其中添加成员。我已将所有权添加到管理员。我创建了一个新的所有权,我可以从球员、球队和文字中挑选。我想设置一个约束条件,如果一个球员拥有一个给定球队的词,那么属于该球队的球员不能在球队内拥有这个词。他们可能在其他团队中拥有这个词。

现在的样子。我可以让同一支球队的两名不同球员拥有同一个词。坏的。基本上,我希望管理员说出这个团队中拥有的所有单词,而不是让它们在下拉列表中可用。

我如何模拟这种关系?如何在管理员中获得此功能?

编辑:我添加了会员模型只是为了表明我正在尝试解决一个不同的问题。正如我所说,这是我真正使用的简化示例。如您所见,我已经完成了成员关系,我正在尝试解决一个单独的所有权问题。

4

1 回答 1

3

您的架构不正确。您应该使用Django 文档中的“多对多关系上的额外字段” 。

它也在 SO 上突出显示。

查看unique_together您的“团队编号”关联。我不确定它是否也可以与多对多方法中的额外字段一起使用。否则,您可以强制执行视图中的唯一性,但我相信unique_together应该适用于您的情况。

对于 1-99 的限制,您应该将其包含在表单验证中,并结合唯一性检查,您不需要整个表来存储数字 1-99。

更新您的编辑

我不确定您是否真的阅读了我的帖子或关注了我的任何链接,但它完全解决了您描述的问题,当然除非您仍然没有正确解释问题。数字的“所有权”不是你应该建模的东西,你应该在它所属的地方表达它:

class Player(models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name

class Team(models.Model):
    name = models.CharField(max_length=128)
    players = models.ManyToManyField(Player, through='Membership')

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    player = models.ForeignKey(Player)
    team = models.ForeignKey(Team)
    number = models.IntegerField()
    """ ... """

    class Meta:
        unique_together = ('team', 'number')

所以请再次向我解释您如何需要球员-球队-编号关联的所有权模型,因为我不确定您到底想要实现什么,这与我已经提供给您的是分开的。

于 2009-07-23T17:05:59.193 回答