假设你正在开发一个Django项目,有几个人使用(例如) git。当你做git pull的时候,你可能会得到一些南向迁移,然而,你可能没有注意到(由于某些原因)。然后,当您继续开发时,您可能会遇到python异常,因为您没有进行迁移。现在,有时你可能需要一段时间才能发现你忘记了这一点,这是相当恼人的。
因此,我在想,难道South不能检测到你还没有完成所有的迁移,如果完成了就抛出一个异常吗?
我想,如果你想在不做迁移的情况下继续开发,你可以关闭这个设置。
发布于 2013-06-27 00:43:19
好的,我做了一些中间件来做我想做的事情。当您发出请求时,它会检查您尚未应用的迁移,并引发异常。请确保仅在开发过程中使用此中间件!
您也可以在https://gist.github.com/gitaarik/5974176上找到源代码
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发布于 2013-06-26 08:48:09
好吧,这就是我的方式。
我有一个包含3个迁移的应用程序迁移,即“python manage.py south_test --list”显示:
south_test
(*) 0001_initial
(*) 0002_auto__add_person
( ) 0003_auto__add_field_person_age这是(不太)神奇的代码:
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命令。
希望这能有所帮助!
https://stackoverflow.com/questions/17307169
复制相似问题