Как я могу сказать django 1.7 поместить миграцию в определенную папку

Я столкнулся с довольно интересной ситуацией.

Мне нужно расширить модель группы django по умолчанию некоторыми полями. Сначала я попытался использовать наследование, например. наследовать от модели группы и изменить некоторые ссылки, но, похоже, я не могу изменить все необходимые ссылки, поэтому этот способ полностью нарушает систему разрешений django.

Затем я нашел этот ответ: Как расширить модель группы Django? где парень предложил использовать метод field.contribute_to_class().

Я поместил эту настройку прямо над определением модели в ‹ myapp >. (не спрашивайте меня, зачем мне роли для группы, это не моя идея, они мне просто нужны :D)

if not hasattr(Group, 'roles'):
    field = models.ManyToManyField(
        Role, verbose_name=_('roles'), blank=True,
        help_text=_('List of roles attached to this group'),
           related_name='groups')
    field.contribute_to_class(Group, 'roles')


class MyGroup(Group):

    class Meta:
        proxy = True

    def _sync_permissions(self):
        """
            This method will sync group permissions with all attached Roles.
        """
        self.permissions.clear()
        for role in self.roles.all():
            self.permissions.add(role.permissions)
        self.save()

Эта часть, кажется, работает (она действительно изменяет модель django.contrib.auth.models.Group)

Но дальше мне нужно сгенерировать миграцию для модели группы. Если я просто запускаю ./manage.py makemigrations <myapp>, он создает миграцию для модели группы, но пытается поместить ее в приложение django.contrib.auth, это определенно не то, что мне нужно.

Итак, мой вопрос здесь:

Есть ли способ сказать django сгенерировать миграцию для модели группы, но не создавать файл миграции в каталоге libs python, а создать его внутри ‹ myapp > или просто вывести код миграции?


person Maxim Leonovich    schedule 12.12.2014    source источник
comment
Похоже, что другим возможным решением для этого конкретного случая является определение m2m между группой и ролью на стороне роли. Таким образом, для роли будет создана миграция, а обратное отношение будет автоматически добавлено в группу.   -  person Maxim Leonovich    schedule 15.12.2014


Ответы (2)


место, где django ищет миграции, можно настроить с помощью MIGRATION_MODULES. в вашем settings.py, в любом случае это означает, что ВСЕ миграции (не только новые) должны быть там. Вам нужно скопировать исходные миграции и обновить их вручную при обновлении Django.

Вы можете создать специальный пакет, чтобы не конфликтовать с вашими миграциями Es.

MIGRATION_MODULES = {
     'django.contrib.auth' : 'myapp.auth_migrations',
     'myapp': 'myapp.migrations'  # this line is only to clarify. IT'S NOT NEEDED AT ALL 
}
person sax    schedule 12.12.2014
comment
Да, вы правы, мне придется скопировать все существующие миграции из 'auth' в мое новое приложение и... они будут конфликтовать с собственными миграциями приложения :( Но в любом случае, я попытаюсь сделать что-нибудь с этим завтра . Спасибо за ответ! - person Maxim Leonovich; 12.12.2014

Я раньше не видел решения этой проблемы в классе field.contribute_to_class() to.

Для меня это выглядит немного грязно, как обезьянья заплатка.

Вы бы вернулись и использовали отношение 1:1 к Group, или унаследовали от Group.

Вы говорите, что не можете изменить все необходимые ссылки на группу? Чего не хватает?

Я знаю, что это не ответ на ваш вопрос, но, возможно, решение вашей проблемы :-)

person guettli    schedule 12.12.2014
comment
Первая проблема, с которой я столкнулся при наследовании, заключалась в том, что мне пришлось изменить отношение User.groups, чтобы оно указывало на мою новую группу. Django не позволяет переопределять поля в унаследованных моделях (мне пришлось переопределить AbstractUser.groups), мне пришлось скопировать МНОГО базовых моделей только для изменения одного поля. Но потом оказалось, что обратное отношение под названием «группа» жестко закодировано в некоторых местах, например github.com/django/django/blob/master/django/contrib/auth/ . На самом деле это означает, что мне нужно скопировать весь бэкэнд, чтобы изменить это... Что тогда остается неизменным по сравнению с исходной авторизацией django? - person Maxim Leonovich; 12.12.2014