Я работаю с устаревшей базой данных, которая использует MySQL big int, поэтому я настраиваю простое поле настраиваемой модели, чтобы справиться с этим:
class BigAutoField(models.AutoField):
def get_internal_type(self):
return "BigAutoField"
def db_type(self):
return 'bigint AUTO_INCREMENT' # Note this won't work with Oracle.
Это прекрасно работает с django south для полей id / pk (mysql desc "| id | bigint (20) | NO | PRI | NULL | auto_increment |"), но поля ForeignKey в других моделях ссылающиеся поля создаются как int (11), а не bigint (20).
Я предполагаю, что мне нужно добавить правило самоанализа в BigAutoField, но, похоже, в документации нет упоминания о таком правиле (http://south.aeracode.org/docs/customfields.html).
Обновление: В настоящее время используется Django 1.1.1 и South 0.6.2
Обновление 2:
Кажется, код Django ответственен.
из django.db.models.fields.related.ForeignKey.db_type ():
rel_field = self.rel.get_related_field()
if (isinstance(rel_field, AutoField) or
(not connection.features.related_fields_match_type and
isinstance(rel_field, (PositiveIntegerField,
PositiveSmallIntegerField)))):
return IntegerField().db_type()
Поскольку я перегружаю AutoField, isinstance возвращает True и по умолчанию использует IntegerField. Думаю, мне придется скопировать код AutoField и сделать это таким образом. , .