ManyToManyField 的 Django OneToOneField 子集

Posted

技术标签:

【中文标题】ManyToManyField 的 Django OneToOneField 子集【英文标题】:Django OneToOneField subset of a ManyToManyField 【发布时间】:2013-02-16 16:19:31 【问题描述】:

基本上我正在编写一个网站来模拟运动队,我有两个模型,球员和球队。一个 Team 与 player 有 ManyToManyField 关系,还有一个代表队长的 OneToOneField 应该仅限于团队中的玩家(即你不能有一个不是玩家之一的队长)。

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

class Team(models.Model):
    players = models.ManyToManyField(Player)
    captain = models.OneToOneField(Player)
    ....

基本上我想知道什么是限制 OneToOneField 的最佳方法,队长,只选择球队中的一名球员。

我试过了

limit_choices_to='team_set__players__name__icontains':"" 

作为一个 kwarg,我认为唯一可行的方法是在船长字段上使用自定义验证器来进行数据库查找,但肯定有更好的方法吗?

感谢您的帮助。

【问题讨论】:

您是否在后台创建球队和球员? 【参考方案1】:

您需要覆盖 Team 模型上的 clean 方法。看看docs。

from django.core.exceptions import ValidationError

class Team(models.Model):
    def clean(self):
        if self.captain not in self.players.all():
             raise ValidationError("Captain must be already be a player")

is_valid 在模型上运行时,您的clean 方法将被自动调用。

【讨论】:

谢谢,我在表单中经常使用这种方法,但从未想过要在模型上使用。

以上是关于ManyToManyField 的 Django OneToOneField 子集的主要内容,如果未能解决你的问题,请参考以下文章

关于 django ManyToManyField

使用自定义字段扩展 Django 的 ManyToManyField

删除 django 模型中不相关的对象(manytomanyfield)

Django 1.8 - 中间多对多关系 - 使用“ManytoManyField”的结果是啥?

Django:如何检查用户是不是已经在 ManyToManyField 上投票?

Django 管理员:list_editable 中的 ManyToManyField?