2010-03-22 4 views
1

Я работаю с устаревшей базой данных, которая использует MySQL большой Int поэтому настройки I простой пользовательской модели поле справиться с этим:Джанго Юг Внешние ключи, относящиеся к ПКС с пользовательскими полями

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).

Update: В настоящее время с помощью Django 1.1.1 и 0.6.2 Юг

Update 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 возвращается Правда, и это недобросовестный IntegerField. Думаю, мне придется скопировать код AutoField и сделать так. , ,

ответ

1

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

+0

Да, я обнаружил это после замены всего кода AutoField. ForeignKey затем устанавливает себя в bigint AUTO_INCREMENT, что сильно нарушает ситуацию. Django 1.2 предлагает bigint, поэтому я собираюсь решить проблему с помощью ручного миграционного sql-запроса в моих южных миграциях до тех пор, пока мы не перейдем к 1.2 и 0.7. –

Смежные вопросы