2013-03-02 3 views
0

기본적으로 스포츠 팀 모델 웹 사이트를 작성 중이며 Player와 Team이라는 두 가지 모델이 있습니다. 팀에는 플레이어와 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, 선장을 제한하는 가장 좋은 방법은 무엇인지 알고 싶어하고있다.

나는 kwarg 나는 데이터베이스 조회를 수행하는 주장 필드에 사용자 정의 유효성 검사기 것 일 수 있다고 생각하는 유일한 다른 방법으로

limit_choices_to={'team_set__players__name__icontains':""} 

을 시도했다, 그러나 확실하게 더 나은 방법이 있어야한다?

도움 주셔서 감사합니다.

+0

관리자로 팀과 선수를 만들고 있습니까? – czarchaic

답변

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