ManyToManyField的Django OneToOneField子集

时间:2013-03-02 02:31:03

标签: django model many-to-many subset one-to-one

基本上我正在写一个网站来模拟运动队,我有两个模型,球员和球队。一支球队与球员有一个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 个答案:

答案 0 :(得分:2)

您需要覆盖clean模型上的Team方法。看看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")

在模型上运行clean时自动调用is_valid方法。