2013-03-02 85 views
0

基本上我正在写一个网站模型运动队,我有两个模型,播放器和团队。一个球队与球员之间有ManyToManyField关系,并且还有一个代表队长的OneToOneField,这个球员应该只限于球队中的球员(即你不能有一个不是球员之一的队长)。Django OneToOneField子集ManyToManyField

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和唯一的其他方式,我认为可以工作将是对,做数据库查找队长领域的自定义验证,但肯定必须有一个更好的办法?

感谢您的任何帮助。

+0

您是否在管理员中创建团队和玩家? – czarchaic 2013-03-02 06:15:08

回答

2

您需要覆盖Team模型上的clean方法。看看docs。当自动当is_valid是在模型上运行

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意志方法被调用。

+0

谢谢,我一直使用这种方法很多形式,但从来没有想过要在模型上做到这一点。 – Scott 2013-03-02 11:50:28