2017-11-16 1 views
0

Die Kontext ist: Ich habe ein Match-Modell, wo ich Daten für ein Fußballspiel speichern möchte. Es gibt einige Felder, die allen Spielen gemeinsam sind (nicht der Wert, den ich als Feldnamen bezeichne), wie Saison, Lokal_Team, Auswärts_Team ... Aber die Statistiken des Spiels werden sich unterscheiden (ein Spiel kann 2 Tore haben) und ein anderer 0).Vorwärts und Rückwärts Feld Beziehungen in Django

Mein Ansatz eine gemeinsame abstrakte zum Aufbau (Django-Modell) von Spiel ist, um die Klasse Statistik Erstellung (die Aktionen speichern) und die Class Action. Also:

Aktion werden Felder -> Minute, Spieler, Aktion (Ziel, rote Karte ...)

Stats werden Felder -> Aktionen (viele zu viele Feld mehrere Aktionen speichern)

Spiel wird Felder haben -> lokal, weg, ref, Stadion, Statistiken (so haben alle Übereinstimmungen 1 gemeinsames Feld, das ist Stats).

Die große Frage kommt jetzt, wenn ich möchte einen richtigen Namen zu Aktionen und Statistiken geben. Da viele Aktionen und Statistiken aus verschiedenen Matches zusammen gespeichert werden, wenn de MatchAdminForm mich nach den Statistiken des Spiels fragt, möchte ich schnell wissen, welcher entspricht, auch wenn das StatsAdminForm mich nach den Aktionen fragt.

Das Ideal für Statistiken wäre, den Namen des local_team des Spiels zu fangen, zu dem diese Statistik gehört. How can I access to that name if Match has not been created yet?? (Gleiche Parallelität mit Aktionen und Statistiken)

Hier teile ich meine models.py, so können Sie überprüfen.

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) 

Summieren, wenn ich im Admin-Browser API bin und wählen Sie MATCH Im Statistik-Feld ADD, ich bin in der Lage STATS ADD (die in dem entsprechenden Spiel gespeichert werden gehen, aber ich mag Speichern eines benutzerdefinierten Feldnamens für das Namensfeld für Statistiken sowie den zweiten Fall).

Vielen Dank im Voraus Jungs!

PR

Antwort

0

würden Sie die related_name verwenden zurück durch spezifische instance zu verfolgen. Zum Beispiel:

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

^Das bezieht sich auf die MatchKlasse, nicht eine Instanz.

Stattdessen können Sie verwenden:

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

Hallo @Hybrid Dank für die Antwort! Dies ist ein Fehler in der Beziehung Reasing: ‚Exception Typ: \t RelatedObjectDoesNotExist Ausnahmewert: \t Statistik hat keine match_stats.' –

Verwandte Themen