Вдохновлен lfagundes, но с небольшой, но важной коррекцией:
class BigAutoField(fields.AutoField):
def db_type(self, connection): # pylint: disable=W0621
if 'mysql' in connection.__class__.__module__:
return 'bigint AUTO_INCREMENT'
return super(BigAutoField, self).db_type(connection)
add_introspection_rules([], [r"^a\.b\.c\.BigAutoField"])
Обратите внимание, что вместо расширения BigIntegerField, я расширяю AutoField. Это важное различие. При использовании AutoField Django будет извлекать идентификатор AUTO INCREMENTed из базы данных, а BigInteger - нет.
Одной из проблем при переходе с BigIntegerField на AutoField было преобразование данных в int в AutoField.
Уведомление из автополя Джанго:
def to_python(self, value):
if value is None:
return value
try:
return int(value)
except (TypeError, ValueError):
msg = self.error_messages['invalid'] % str(value)
raise exceptions.ValidationError(msg)
и
def get_prep_value(self, value):
if value is None:
return None
return int(value)
Оказывается, это нормально, как проверено в оболочке Python:
>>> l2 = 99999999999999999999999999999
>>> type(l2)
<type 'long'>
>>> int(l2)
99999999999999999999999999999L
>>> type(l2)
<type 'long'>
>>> type(int(l2))
<type 'long'>
Другими словами, приведение к типу int не будет усекать число и не будет изменять базовый тип.