2017-08-05 1 views
0

Ich brauche deine Hilfe noch einmal. Ich arbeite an einem Projekt für meine Wargaming-Gruppe. Es ist eine einfache Ranking-Website. Also haben wir Spieler, sie nehmen an Turnieren teil und bekommen Punkte. Ich bin an dem Punkt angelangt, an dem ich Spieler zu Turnieren zuordnen kann und den Platz, den sie beim Turnier genommen haben, ihrem Namen zuordnen kann.Django Berechnung basierend auf berechneten Wert

Jetzt muss ich Punkte berechnen. Algorithmus ist einfach, aber ich habe Probleme, einen Wert von Tournament Modell zu Ranking zu übergeben. Jedes Turnier hat eine berechnete Bewertung (basierend auf anderen Dingen, meist größeres Turnier, größere Bewertung) und in anderen Modellen konnte ich es nicht benutzen und brauche deine Hilfe damit. Darüber hinaus wäre es großartig, wenn ein Rating-Wert in Tournament eine Aktualisierung aller abhängigen Berechnungen erzwingen würde.

So haben wir Modelle wie folgt aus:

class Player(models.Model): 
    class Meta: 
    name = models.CharField(max_length=50) 
    nicname = models.CharField(max_length=50,blank=True) 
    army = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.name 
    def __str__(self): 
     return self.name 

class Tournament(models.Model): 
    class Meta: 
    name = models.CharField(max_length=100) 
    date = models.DateTimeField('date') 
    player_num = models.IntegerField 
    points = models.FloatField(default=1000.00) 


    def __unicode__(self): 
     return self.name 
    def __str__(self): 
     return self.name 

Und dann habe ich ein Ranking-Modell dieser Art:

class TournamentStandings(models.Model): 
    tournament = models.ForeignKey(Tournament, on_delete=models.CASCADE) 
    player = models.ForeignKey(Player, on_delete=models.CASCADE) 
    player_place = models.FloatField 

In admin.py ich tun Berechnungen für TournamentAdmin:

fields = ['name', 'date', 'player_num', 'points', 'get_rating'] 
def get_rating(self, obj): 
    return obj.points/100.00 

Und jetzt würde ich gerne Berechnung für TournamentStandingsAdmin machen:

def player_points(self, obj): 
    return (obj.tournament.player_num/obj.player_place)* obj.tournament.get_rating 

Aber das Ergebnis ist ein Fehler

‚Tournament‘ Objekt hat kein Attribut ‚get_rating‘

Also meine Vermutung meine berechnet ist get_rating ist kein wahres Modellfeld aber wie geht das um?

+0

Wenn Sie die Methode auf das Modell nennen wollen, dann müssen Sie es tatsächlich auf dem Modell definieren, nicht in der Admin-Klasse. –

Antwort

2

als @Daniel schlug vor, dass Sie get_rating Methode zu Ihrem Tournament Modell hinzufügen müssen.

class Tournament(models.Model): 
    name = models.CharField(max_length=100) 
    date = models.DateTimeField('date') 
    player_num = models.IntegerField 
    points = models.FloatField(default=1000.00) 

    .... 
    def get_rating(self): 
     return obj.points/100.00 

Danach Sie die Methode mit einem Tournament Objekt aufrufen kann wie folgt:

obj.tournament.get_rating 
Verwandte Themen