【问题标题】:How to calculate and store scores in django betting game?如何在 django 投注游戏中计算和存储分数?
【发布时间】:2018-02-03 19:54:51
【问题描述】:

我正在开发我的第一个 django 项目,这是一个体育博彩游戏。

我的模型是:

class Game(models.Model):
    home_team = models.CharField(max_length=200)
    away_team = models.CharField(max_length=200)
    home_goals = models.IntegerField(default=None)
    away_goals = models.IntegerField(default=None)


class Bet(models.Model):
    gameid = models.ForeignKey(Game, on_delete=models.CASCADE)
    userid = models.ForeignKey(User, on_delete=models.CASCADE)
    home_goals = models.IntegerField()
    away_goals = models.IntegerField()
    score = models.IntegerField(default=None, null=True)

计算分数的逻辑是:

WHEN polls_bet.home_goals = polls_game.home_goals AND polls_bet.away_goals = polls_game.away_goals THEN 2 
WHEN polls_game.home_goals > polls_game.away_goals AND polls_game.home_goals > polls_game.away_goals THEN 1 
WHEN polls_bet.home_goals < polls_bet.away_goals AND polls_game.home_goals < polls_game.away_goals THEN 1 
ELSE 0

我能够使用将所有数据组合在一个表中的数据库视图轻松解决它,但它似乎不适用于 django 迁移..

所以我在考虑更新游戏目标后的sql触发器,但是我不知道如何传递用户ID等条件。

第二个想法是创建额外的“分数”表:

gameid, 
userid, 
betid,
score

但话说回来,我不知道如何计算分数。 请建议如何正确完成此操作,而不使用 sql 视图。我感谢所有答案!

【问题讨论】:

    标签: django sqlite django-models triggers


    【解决方案1】:

    您可以在 Bet 模型上定义一个“分数”属性来轻松解决这个问题。请参考文档here

    您的属性实现将类似于:

    @property
    def score(self):
        if (self.home_goals == self.game__home_goals and
                self.away_goals == self.game__away_goals):
            return 2
        if (self.game__home_goals > self.game__away_goals):
            return 1
        if (self.home_goals < self.away_goals and
                self.game__home_goals < self.home_goals):
            return 1
        return 0
    

    顺便说一句,外键关系的正常命名约定是小写的模型名称。所以它变成了 'game' 和 'user' 而不是 'gameid' 和 'userid'。另外我相信你在第二个条件下有一些错别字。

    【讨论】:

    • 谢谢你,Jose,这听起来真的很棒!不幸的是,当我从我的投注模型中删除分数并将其添加为属性(粘贴您的代码)然后迁移时 - 分数字段从我的投注表中消失了。我在这里做错了什么?
    • @Patr01,属性是一个计算值,它不存储在数据库中。如果要存入数据库,需要手动更新,但可以使用同样的逻辑。
    • 我需要存储它,这样我就可以为每个用户求和,对吧?你是什​​么意思我必须手动更新它?感谢您的考虑,这是我的第一步 :)
    • @Patr01,您需要知道何时更新分数,因为下注时可能不知道结果。可能是 Game 模型上的 post_save 信号,并在游戏完成时更新 Bet 模型。见docs.djangoproject.com/en/2.0/topics/signals
    猜你喜欢
    • 2022-06-11
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2016-06-07
    相关资源
    最近更新 更多