2015-07-13 3 views
0

Я использую django 1.8.1 и пытаюсь расширить длину поля имени auth_user из одного из моих приложений. Перед тем, с юга, я мог бы просто предназначаться приложение с подчеркиванием, как так:django handwritten migrations alter auth

db.alter_column('auth_group', 'name', models.CharField(max_length=120, null=False, blank=False)) 

Однако в Джанго 1.8, я не вижу способ сделать это, как Джанго Путс имя приложения в SQL жгутов исходный код. Я не хочу редактировать исходный код django, поэтому я не могу изменить это. мой текущий аттемп находится здесь:

class Migration(migrations.Migration): 

dependencies = [ 
    ('auth', '0006_require_contenttypes_0002'), 
]  

operations = [ 
    migrations.AlterField('auth_group', 'name', field=models.CharField(max_length=120, null=False, blank=False)), 
] 

Пожалуйста, помогите. Я не хочу редактировать исходный код django, и я хочу только сделать migrations.RunSQL в крайнем случае.

ответ

0

Ну, есть хитрый способ сделать это:

# -*- coding: utf-8 -*- 
from django.db.migrations import Migration as DjangoMigration, AlterField 
from django.db.models import CharField 


class Migration(DjangoMigration): 
    dependencies = [ 
     # Specify other dependencies, if required. 
     ('auth', '0006_require_contenttypes_0002') 
    ] 
    operations = [ 
     AlterField(
      model_name='User', 
      name='username', 
      field=CharField(max_length=120) 
     ) 
    ] 

    def mutate_state(self, project_state, preserve=True): 
     """ 
     This is a workaround that allows to store ``auth`` 
     migration outside the directory it should be stored. 
     """ 
     app_label = self.app_label 
     self.app_label = 'auth' 
     state = super(Migration, self).mutate_state(project_state, preserve) 
     self.app_label = app_label 
     return state 

    def apply(self, project_state, schema_editor, collect_sql=False): 
     """ 
     Same workaround as described in ``mutate_state`` method. 
     """ 
     app_label = self.app_label 
     self.app_label = 'auth' 
     state = super(Migration, self).apply(project_state, schema_editor, collect_sql) 
     self.app_label = app_label 
     return state 

Поместите это в migrations папке вашего приложения с собственным именем, например, 0001_alter_auth_user_username.py.

Я не уверен, однако, что это хороший подход.

+0

Так что, по сути, я меняю имя приложения для всего класса миграции? –

+0

@IanKirkpatrick Вы меняете его в определенных местах, поэтому миграция может получить модель из правильного приложения, т. Е. Модель «Пользователь» будет получена из приложения «auth», а сама миграция будет принадлежать вашему проекту. –

0

Thanks @Ennest Ten.

В моем случае, я сохранил зависимость от:

dependencies = [ # Specify other dependencies, if required. ('auth', '0004_alter_user_username_opts') ]

Убедитесь, что вы запустите «питон manage.py мигрировать», чтобы это отражало вам дб.

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