前言:我是 django 和数据库设计的新手。
super 编辑:我做了一些重大更改,因此更改之前的答案可能会引用此处不存在的内容。我道歉。
我会直接看代码: 模型.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 表已填充。 在管理中我创建了一个播放器。然后我创建一个团队并向其中添加成员。我已将所有权添加到管理员。我创建了一个新的所有权,我可以从球员、球队和言语中进行选择。我想设置一个限制,如果一个玩家拥有给定团队的一个单词,那么属于该团队的玩家不能在团队内拥有该单词。他们可能在其他团队中拥有话语权。
现在就是这样。我可以让同一支球队的两名不同球员拥有同一个词。坏的。基本上,我希望管理员说获取该团队内拥有的所有单词,而不是在下拉列表中提供它们。
我如何建模这种关系?如何在管理员中获得此功能?
编辑:我添加成员(member)模型只是为了表明我正在尝试解决不同的问题。正如我所说,这是我真正正在处理的事情的一个简化示例。正如您所看到的,我已经完成了成员关系,我正在尝试解决一个单独的所有权问题。
最佳答案
您的架构不正确。您应该使用“多对多关系上的额外字段”as seen here in the Django docs .
It is also highlighted here on SO.
Look into unique_together
为您的“团队编号”关联。我不确定它是否也可以与多对多方法中的额外字段结合使用。否则,您可以强制 View 中的唯一性,但我确实相信 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')
因此,请再次向我解释一下您如何需要球员-球队-编号关联的所有权模型,因为我不确定您到底想要实现什么与我已经为您提供的内容不同的目标。
关于database - 基于 django 中另一个字段的唯一值字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1172966/