2017-08-05 160 views
0

我需要你的幫助一次。我正在爲我的wargaming團隊開發一個項目。這是一個簡單的排名網站。所以我們有球員,他們參加比賽並獲得積分。我已經達到了能夠將球員分配到錦標賽中的地步,並將他們在錦標賽中獲得的位置歸爲他們的名字。基於計算值的Django計算

現在我必須計算積分。算法很簡單,但我在將值從Tournament模型傳遞給Ranking時遇到問題。每個錦標賽都有一個計算的評分(基於其他的事情,大部分是較大的錦標賽,較大的評分),在其他模型中,我無法使用它,需要您的幫助。最重要的是,如果在錦標賽中更改評分值會強制更新所有相關計算,那將會非常棒。

所以我們的模型一樣,:

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 

然後,我有這樣的一個排名模型:

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

在admin.py我做計算爲TournamentAdmin:

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

現在我想計算TournamentStandingsAdmin:

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

但結果卻是一個錯誤

「比賽」對象有沒有屬性「get_rating」

所以我的猜測是我的計算get_rating是不是一個真正的示範田,但如何解決這個問題?

+0

如果你想打電話的模型的方法,那麼你需要真正定義它的模式,而不是在管理類。 –

回答

2

由於@Daniel建議您需要將get_rating方法添加到您的Tournament模型中。

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 

在此之後,你可以調用一個Tournament對象的方法如下:

obj.tournament.get_rating