【问题标题】:Big integer field in django modelsdjango 模型中的大整数字段
【发布时间】:2010-09-21 23:23:20
【问题描述】:

简而言之:如何在 Django 模型中指定 BIGINT?

在我正在使用 Django(0.97-svn 版本)进行的当前项目中,我将所有模型中的所有整数字段都定义为 IntegerField。在我使用 SQLite 作为数据库后端的开发周期中,它运行良好。然而,当我开始使用 MySQL 时,我注意到对于其中一个 IntegerFields,MySQL 正在截断数据——显然,由于我仍然不知道的原因,SQLite 没有抱怨。我查看了架构,发现 Django 中的 IntegerField 在 MySQL 中表示为 INT(11) 字段。当然,MySQL 截断数据的原因是数据长度超过 11 位。要解决此问题,我必须手动将列更新为,在本例中为 BIGINT(20)。 Django 和 MySQL 与之和平共处。但是每当我重置包含该 BIGINT 的模型的应用程序时,Django 再次将其创建为 INT(11)。我查看了 Django 文档,但没有找到任何东西。我是否忽略了什么?

谢谢。

【问题讨论】:

    标签: mysql django


    【解决方案1】:

    SQLite 永远不会抱怨。它使用“清单类型”,即值具有类型,而不是列。它可以让你将 bigtext 存储在 smallint 列上,或者任何你想要的! (除非您定义一个整数主键,它使用 64 位整数)。

    这是一个非常方便的功能,但如果您要使用不同的引擎进行部署,那么它对于 SQLite 的开发来说是一个糟糕的选择。

    要使用 BIGINT,您必须创建一个自定义字段类。不幸的是,这部分在 Django 1.0 上发生了变化,所以如果/当你更新时,你必须重写它。

    【讨论】:

      【解决方案2】:

      试试 DecimalField。

      【讨论】:

      • 这是一个有效的答案。 BigInteger 上升到 9223372036854775807,但您可以使用 DecimaField my_number = models.DecimalField( max_digits=99, decimal_places=0, ) 当然这将是 Decimal,而不是 int,但它将验证用户无法插入数字在点之后,将允许更大的数字。
      【解决方案3】:

      BigIntegerField 已添加到变更集 11887、2009-12-17 09:10:38,并且是 Django 1.2 和更新版本的一部分。

      【讨论】:

        猜你喜欢
        • 2020-08-14
        • 1970-01-01
        • 2019-12-24
        • 2016-08-11
        • 1970-01-01
        • 2013-02-03
        • 2011-06-26
        • 2021-10-12
        • 2010-10-25
        相关资源
        最近更新 更多