2017-11-16 9 views
0

은 다음과 같습니다. 축구 경기를 위해 데이터를 저장하려는 성냥 모델이 있습니다. 일부 필드는 시즌, local_team, away_team과 같은 모든 경기에 공통적으로 적용됩니다 (필드 이름을 의미하는 값이 아님). 그러나 경기의 통계는 달라질 수 있습니다 (한 경기는 2 골 및 또 다른 0).장고의 전방 및 역방향 필드 관계

내 접근 일치의 공통 추상 (장고 모델)을 구축 클래스 통계를 작성하고 집단 소송 (작업을 저장합니다). 그래서 :

조치 필드를해야합니다 -> 분, 플레이어, 액션 (목표, 레드 카드 ...)

통계 필드를해야합니다 -> (여러 가지 작업을 저장하는 많은 분야에 많은) 행동

경기에는 필드, 로컬, 어웨이, 레디 언, 스타디움, 스탯이 포함됩니다 (모든 경기는 하나의 공통 필드 인 스탯이므로).

큰 문제

내가 행동과 통계에 적당한 이름을주고 싶습니다 지금을 온다. Match.com은 다른 경기의 많은 액션과 통계가 함께 저장되기 때문에 MatchAdminForm이 게임의 통계를 요청할 때 StatsAdminForm이 내게 행동을 요구할 때와 똑같은 것을 빠르게 알고 싶습니다.

통계에 이상적인 것은이 통계가 속한 경기의 local_team의 이름을 파악하는 것입니다. How can I access to that name if Match has not been created yet?? (작업 및 통계와 동일한 병렬 처리)

여기에서 내 models.py를 공유하여 확인할 수 있습니다. 내가 관리자 브라우저 API 안에 있고 통계 필드에서 MATCH 추가를 선택하면

from django.db import models 
from django.utils import timezone 

from globalModels.models import Season 
from seasonalModels.models import SeasonTeam as Team 
from seasonalModels.models import SeasonPlayer as Player 
from seasonalModels.models import SeasonReferee as Referee 
from seasonalModels.models import SeasonStadium as Stadium 


class Action(models.Model): 

    ACTION_CHOICES = (
     ('Gol', 'Gol'), 
     ('Yellow', 'Yellow Card'), 
     ('2Yellow', 'Second Yellow Card'), 
     ('Red', 'Red Card'), 
    ) 

    # minute = models.IntegerField(choices = (range(1,90))) 
    name = models.CharField(max_length=255, default='abc') 
    minute = models.IntegerField(default=0) 
    player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='player_action') 
    action = models.CharField(choices=ACTION_CHOICES, max_length=255) 

    def __str__(self): 

     return "%s %s %s" % (Match.local_team, Match.away_team) # Ideally I will like the stat to give this information BUT MATCH DOESN'T EXISTE YET error 


class Stats(models.Model): 

    actions = models.ManyToManyField(Action, related_name='action_name') 
    name = models.CharField(max_length=255, default='auto') 

    def __str__(self): 

     return "%s %s %s" % (Match.local_team, Match.away_team) # Ideally I will like the stat to give this information BUT MATCH DOESN'T EXISTE YET error 


class Match(models.Model): 

    season = models.ForeignKey(Season, on_delete=models.CASCADE, related_name='match_season') 
    date = models.DateTimeField(default=timezone.now) 
    # round = models.IntegerField(choices = (range(1,10))) 
    round = models.IntegerField(default=0) 
    number = models.IntegerField(default=0, unique=True) 

    local_team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='match_local_team') 
    away_team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='match_away_team') 
    referee = models.ForeignKey(Referee, on_delete=models.CASCADE, related_name='match_referee') 
    stadium = models.ForeignKey(Stadium, on_delete=models.CASCADE, related_name='match_stadium') 

    local_team_possession = models.IntegerField(blank=True, null=True) 
    away_team_possession = models.IntegerField(blank=True, null=True) 

    stats = models.OneToOneField(Stats, blank=True, related_name='match_stats') 

    local_team_goals = models.IntegerField(blank=True, null=True) 
    away_team_goals = models.IntegerField(blank=True, null=True) 
    local_team_yellow_cards = models.IntegerField(blank=True, null=True) 
    local_team_red_cards = models.IntegerField(blank=True, null=True) 
    away_team_yellow_cards = models.IntegerField(blank=True, null=True) 
    away_team_red_cards = models.IntegerField(blank=True, null=True) 

요약하기, 그 는 해당 경기에 저장하려고하는 통계를 (추가 할 수,하지만 내가 좋아하는 것 두 번째 경우뿐 아니라 통계의 이름 필드에 대해 사용자 지정된 필드 이름을 저장합니다.

미리 감사드립니다.

PR은

답변

0

당신은 당신의 특정 instance을 통해 역 추적하기 위해 related_name을 사용합니다. 예를 들어

def __str__(self): 
    return "%s %s %s" % (Match.local_team, Match.away_team) 

는^즉 Match클래스 아닌 인스턴스를 지칭한다.

대신 사용할 수 있습니다

def __str__(self): 
    return "{0} {1}".format(self.match_stats.local_team, self.match_stats.away_team) 
+0

안녕 @Hybrid 덕분에 회신을 위해! 이 관계에 오류가 reasing된다 '예외 유형 : \t RelatedObjectDoesNotExist 예외 값 : \t 통계는 더 match_stats.'이 없습니다 –