【问题标题】:Django calculation based on calculated value基于计算值的Django计算
【发布时间】:2018-01-13 06:44:39
【问题描述】:

我再次需要你的帮助。我正在为我的兵棋推演小组做一个项目。这是一个简单的排名网站。所以我们有球员,他们参加比赛并获得积分。我已经到了可以将球员分配到锦标赛的地步,将他们在锦标赛中的位置分配给他们的名字。

现在我必须计算积分。算法很简单,但我在将值从 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

但是结果是错误的

“Tournament”对象没有“get_rating”属性

所以我的猜测是我计算的 get_rating 不是真正的模型字段,但如何解决这个问题?

【问题讨论】:

  • 如果你想在模型上调用方法,那么你需要在模型上实际定义它,而不是在管理类上。

标签: python django django-models django-admin


【解决方案1】:

正如@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2012-11-14
    • 2010-12-23
    相关资源
    最近更新 更多