2013-09-24 2 views
0

나는 이런 종류의 질문을 적어도 한 번 여기에서 물어 보았다. 그러나 나는 장고로 시작하고있다. 비슷한 질문의 해결책을 적용하는 데 어려움을 겪고있다. 함께 물건.관계가있는 장고 모델

class Guild(models.Model): 
    name = models.CharField(max_length=50) 

class Battle(models.Model): 
    guild1 = models.ForeignKey(Guild, related_name="guild_one") 
    guild2 = models.ForeignKey(Guild, related_name="guild_two") 
    # tournament = models.ForeignKey(Tournament) ??? 

class Tournament(models.Model): 
    name = models.CharField(max_length=50) 
    ???? 

BattleGuilds 사이의 전쟁이며, Tournament 동안 발생 :

나는 나의 모델은 3 개 수업을 통해이한다고 생각합니다. Tournament에는 Battles이 많이있을 수 있습니다. Guild은 여러 개의 Tournaments에 참여할 수 있습니다.

나는 전투에서 어떤 전투가 ​​있었는지보고 토너먼트를 통해 길드 (그들의 모든 전투, 그들이 참가한 모든 토너먼트에서 볼 수 있음)를 검색 할 수 있고 토너먼트를 통해 접근하고 싶습니다. 어떤 길드가 참여했는지 확인하십시오. 위의 코드 (플러스 라인은 내가 commeneted), 어쩌면 토너먼트 클래스 전투를 참조해야한다고 생각하기 때문에 작동합니까?

또한 주어진 토너먼트에 참가한 모든 길드원의 이름을 가져올 수있는 쿼리의 예를 제시 할 수 있다면. 당신이 Tournament에 참조하기위한 인용 부호를 사용한다하더라도 그것이 Battle 후 발표 이후 당신이, 즉 models.ForeignKey('Tournament')을 주석을 제거 할 수 있도록

답변

3

모델 Battle는 대회에 외래 키를 가진위한 좋은 장소입니다.

은 목록 형식에 참여하는 모든 길드의 이름을 얻을 backwards relation objects guild_oneGuild 개체의 guild_twoQ objects.values_list()를 사용합니다. 이처럼 :
>>> from django.db.models import Q 
>>> Guild.objects.filter(Q(guild_one__tournament=t) |\ 
... Q(guild_two__tournament=t)).values_list('name', flat=True) 
[u'red', u'blue', u'green', u'black'] 

어떤 Tournament에 그 t 참조를 가정.

+0

매우 매끄러운, 감사합니다! 또한 특정 길드와 대결 한 모든 길드 이름을 얻으려고합니다. 즉 길드와 길드원의 모든 상대. 나는 이것을 코딩했으나 이름 대신에 길드원 ID 만 얻는다. 'Battle.objects.filter (Q (guild1 = g) | Q (guild2 = g)). . 제발 제안 할 수 있니? – nutship