首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django South -有什么方法可以检测到是否需要进行向南迁移?

Django South -有什么方法可以检测到是否需要进行向南迁移?
EN

Stack Overflow用户
提问于 2013-06-26 04:43:49
回答 2查看 511关注 0票数 1

假设你正在开发一个Django项目,有几个人使用(例如) git。当你做git pull的时候,你可能会得到一些南向迁移,然而,你可能没有注意到(由于某些原因)。然后,当您继续开发时,您可能会遇到python异常,因为您没有进行迁移。现在,有时你可能需要一段时间才能发现你忘记了这一点,这是相当恼人的。

因此,我在想,难道South不能检测到你还没有完成所有的迁移,如果完成了就抛出一个异常吗?

我想,如果你想在不做迁移的情况下继续开发,你可以关闭这个设置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-27 00:43:19

好的,我做了一些中间件来做我想做的事情。当您发出请求时,它会检查您尚未应用的迁移,并引发异常。请确保仅在开发过程中使用此中间件!

您也可以在https://gist.github.com/gitaarik/5974176上找到源代码

代码语言:javascript
运行
复制
from south import migration
from south.models import MigrationHistory


class SouthUnranMigrationCheck(object):

    def process_request(self, request):
        '''
        Checks if you ran all South migrations. If not, it will throw an
        exception (DidNotApplyAllMigrations).
        '''

        unapplied_migrations = self.unapplied_migrations()

        if len(unapplied_migrations) > 0:

            message = u'You haven\'t run the following migrations: {}'.format(
                u''.join(
                    [u'\n  "{}" in app "{}".'.format(name, app)
                    for name, app in unapplied_migrations]
                )
            )

            raise DidNotApplyAllMigrations(message)

    def unapplied_migrations(self):
        '''
        Returns a list of tuples of unapplied migrations. The tuples consist of
        a migration name and an app label.
        '''

        applied_migrations = self.applied_migrations()
        unapplied_migrations = []

        for app_migration_files in migration.all_migrations():

            for migration_file in app_migration_files:

                app_label = migration_file.app_label()
                migration_name = migration_file.name()

                if migration_name not in applied_migrations[app_label]:
                    unapplied_migrations.append((migration_name, app_label))

        return unapplied_migrations

    def applied_migrations(self):
        '''
        Returns a dictionary with the app name in the key, and a list of
        migrations in the value.
        '''

        applied_migrations = {}

        for applied_migration in MigrationHistory.objects.all():

            if applied_migration.app_name not in applied_migrations:
                applied_migrations[applied_migration.app_name] = []

            applied_migrations[applied_migration.app_name].append(
                applied_migration.migration)

        return applied_migrations


class DidNotApplyAllMigrations(Exception):
    '''
    Exception that indicates that you havent run all migrations.
    '''
    pass
票数 1
EN

Stack Overflow用户

发布于 2013-06-26 08:48:09

好吧,这就是我的方式。

我有一个包含3个迁移的应用程序迁移,即“python manage.py south_test --list”显示:

代码语言:javascript
运行
复制
south_test
  (*) 0001_initial
  (*) 0002_auto__add_person
  ( ) 0003_auto__add_field_person_age

这是(不太)神奇的代码:

代码语言:javascript
运行
复制
from south.models import MigrationHistory
from south.migration import Migrations

all_migrations = Migrations('south_test')
applied_migrations = MigrationHistory.objects.filter(app_name='south_test')

not_applied = list(set(all_migrations) - set([migration.get_migration() for migration in applied_migrations]))

现在,您有了not_applied迁移。也许有一些关于幽灵迁移的细节。

有关详细信息,请参阅south的migrate命令。

希望这能有所帮助!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17307169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档