Django South Foreign Keys со ссылкой на ПК с пользовательскими полями - PullRequest
1 голос
/ 22 марта 2010

Я работаю с устаревшей базой данных, которая использует 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 и сделать это таким образом. , .

1 Ответ

1 голос
/ 22 марта 2010

Зачем вам копировать AutoField, когда это явно проблема FK?Подкласс ForeignKey и возвращает правильный тип.

...