Ответ 1
Хотя я не тестировал его, но вы можете просто подклассом 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
.