All the docs I\'ve seen imply that you might be able to do that, but there isn\'t anything official w/r/t ulong64/uint64 fields. There are a few off-the-shelf options t
Although I did not test it, but you may wish to just subclass BigIntegerField
. The original BigIntegerField
looks like that (source here):
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)
Derived PositiveBigIntegerField
may looks like this:
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)
Although you should test it thoroughly, before using it. If you do, please share the results :)
EDIT:
I missed one thing - internal database representation. This is based on value returned by get_internal_type()
and the definition of the column type is stored eg. here in case of MySQL backend and determined here. It looks like overwriting db_type()
will give you control over how the field is represented in the database. However, you will need to find a way to return DBMS-specific value in db_type()
by checking connection
argument.