2013-03-02 87 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