fis*_*000 33 python django orm django-models unsigned-long-long-int
我见过的所有文档都暗示你可能会这样做,但是没有任何正式的w/r/t ulong64/uint64字段.在这个领域,有一些现成的选择看起来非常有前途:
BigIntegerField ......几乎,但签了名;PositiveIntegerField......怀疑地看起来像32位; 和DecimalField...一个用python decimal类型表示的固定指针,根据文档 - 当被剔除时,可能会变成类似迂腐和缓慢的数据库字段,即DECIMAL或NUMERIC PostgreSQL类型.......所有这一切看起来像他们可能存放一些这样的.除了他们将会承诺,就像休·格兰特描绘的每一个rom-com角色一样.
我的主要标准是它与Django支持的后端一起工作,没有任何if postgresql (...) elif mysql (...)类型的特殊情况废话.之后,需要速度 - 这是视觉数据库应用程序中的模型字段,它将索引图像派生数据(例如感知哈希和提取的关键点功能),允许按照这些图像的内容进行排序和分组.
所以:有没有一个很好的Django扩展或应用程序,它提供了一些PositiveBigIntegerField适合我的目的?
而且,除非:如果有一种简单可靠的方法来使用Django的库存ORM存储无符号的64位整数,我想知道它.看,我不是二元神童; 我必须在纸上做两个补充 - 所以如果你的这种方法涉及一些有点变化的诡计,请不要犹豫,解释它是什么,即使它明显打击你.提前致谢.
Tad*_*eck 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)
Run Code Online (Sandbox Code Playgroud)
Derived 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)
Run Code Online (Sandbox Code Playgroud)
虽然你应该在使用它之前彻底测试它.如果你这样做,请分享结果:)
编辑:
我错过了一件事 - 内部数据库表示.这基于返回的值,get_internal_type()并且存储列类型的定义,例如.在 MySQL后端的情况下,这里确定.看起来覆盖db_type()将使您可以控制字段在数据库中的表示方式.但是,您需要db_type()通过检查connection参数来找到返回DBMS特定值的方法.