【问题标题】:Django: Database Model For Prize StructureDjango:奖品结构的数据库模型
【发布时间】:2016-09-12 11:31:11
【问题描述】:

我正在尝试找出构建竞赛奖金/奖品结构模型的正确方法,下面是一个示例

第一名:50000 美元 第二名:10000 美元 第 3 至 10 日:1000 美元 10 日至 70 日:500 美元 第 70 至 150 名:25 美元 第 150-400 名:1 美元

我的第一个想法是这样设计:

class Prize(models.Model):
    place=models.IntegerField()
    prize=models.IntegerField()

对我来说,问题是一旦你到达较低层,你就会开始有多个重复的条目。因此,从第 150 到 400 条,我将有 250 条相同的条目。我想知道是否有更聪明的方法来解决这个问题。谢谢。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    首先,永远不要使用整数来存储价格。始终尝试使用小数字段。如果您从未尝试过,有一点需要注意。您必须提供 max_digits 和 decimal_places。例如:

    prize = forms.DecimalField(max_digits=10, decimal_places=2)
    

    所以你只能使用 8 位数字(不是 10 位),小数点后 2 位。

    为了回答您的问题。添加范围范围。 然后还在元中添加 unique_together,这样您就不会在相同的范围内重复获得相同的奖品。

    【讨论】:

    • 当那些只是整数时 - 没有问题,但是在设计架构时,你永远不应该预测你永远不会使用带有小数字段的奖品。假设奖金是 499.99。在这种情况下,您也不应该使用浮点字段,因为“舍入”没有按预期工作。所以你总是应该使用十进制字段。
    • 即使是这样,我真的不明白为什么你需要使用小数而不是浮点数
    • 总是使用 DecimalField 来赚钱。即使是简单的运算(加法、减法)也无法避免浮点舍入问题:>>> 10.50 - 0.20 10.300000000000001 >>> Decimal('10.50') - Decimal('0.20') Decimal('10.30')
    • 我可以指出,专门针对在线支付网关等的标准做法是使用所谓的“次要货币”格式。实际上所有内容都存储为整数。即你存储美分而不是美元。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多