38

我看到的所有文档都暗示您可能能够做到这一点,但是没有任何官方 w/r/t ulong64/uint64 字段。有一些现成的选项在这个领域看起来很有希望:

  • BigIntegerField...几乎,但已签名;
  • PositiveIntegerField... 可疑的 32 位外观;和
  • DecimalFielddecimal...根据文档,用 python 类型表示的固定指针——它可能会变成一个类似的迂腐和缓慢的数据库字段,当被删除时,á la DECIMAL 或 NUMERIC PostgreSQL 类型。

...所有这些看起来可能存储这样的数字。除了没有人会承诺,就像休格兰特描绘的每一个浪漫喜剧角色一样。

我的主要标准是它与 Django 支持的后端一起工作,没有任何if postgresql (...) elif mysql (...)类型的特殊情况废话。之后,需要速度——这是视觉数据库应用程序中的模型字段,它将索引图像派生数据(例如感知散列和提取的关键点特征),允许按这些图像的内容进行排序和分组.

那么:是否有一个好的 Django 扩展或应用程序可以提供某种PositiveBigIntegerField适合我的目的?

而且,除此之外:如果有一种简单可靠的方法可以使用 Django 的库存 ORM 来存储无符号的 64 位整数,我想知道。看,我不是二进制高手;我必须在纸上做二进制补码——所以如果你的这个方法涉及一些位移技巧,不要犹豫解释它是什么,即使它让你觉得很明显。提前致谢。

4

1 回答 1

26

虽然我没有测试它,但你不妨只是子类化BigIntegerField. 原来的BigIntegerField样子(来源在这里):

class BigIntegerField(IntegerField):
    empty_strings_allowed = False
    description = _("Big (8 byte) integer")
    MAX_BIGINT = 9223372036854775807

    def get_internal_type(self):
        return "BigIntegerField"

    def formfield(self, **kwargs):
        defaults = {'min_value': -BigIntegerField.MAX_BIGINT - 1,
                    'max_value': BigIntegerField.MAX_BIGINT}
        defaults.update(kwargs)
        return super(BigIntegerField, self).formfield(**defaults)

派生PositiveBigIntegerField可能如下所示:

class PositiveBigIntegerField(BigIntegerField):
    empty_strings_allowed = False
    description = _("Big (8 byte) positive integer")

    def db_type(self, connection):
        """
        Returns MySQL-specific column data type. Make additional checks
        to support other backends.
        """
        return 'bigint UNSIGNED'

    def formfield(self, **kwargs):
        defaults = {'min_value': 0,
                    'max_value': BigIntegerField.MAX_BIGINT * 2 - 1}
        defaults.update(kwargs)
        return super(PositiveBigIntegerField, self).formfield(**defaults)

尽管您应该在使用它之前对其进行彻底测试。如果你这样做,请分享结果:)

编辑

我错过了一件事——内部数据库表示。这基于返回的值,get_internal_type()并且列类型的定义被存储,例如。这里是 MySQL 后端的情况,并在此处确定。看起来覆盖db_type()可以让您控制该字段在数据库中的表示方式。但是,您需要找到一种db_type()通过检查connection参数来返回特定于 DBMS 的值的方法。

于 2012-05-20T23:47:19.413 回答