2015-06-11 30 views
0

当您执行bin/django syncdb列表中包含所有已经和未同步的应用程序将被返回。django:如何获取未同步的应用程序列表?

Synced: 
> south 
> raven.contrib.django 
> django.contrib.staticfiles 
    ... 

Not synced (use migrations): 
- django_extensions 
    ... 

如何截取这些信息?我在看post_syncdb信号,但是call_back不包含我期望的信息。

编辑 也许我还不够清楚。我知道我可以做这样的事情:

output = Popen(["bin/django","syncdb"], stdout=subprocess.PIPE).communicate()[0] 

或:

def get_syncdb_output(): 
    content = StringIO() 
    call_command('syncdb', stdout=content) 
    import ipdb; ipdb.set_trace() 
    content.seek(0) 
    ansi_escape = re.compile(r'\x1b[^m]*m') 
    return ansi_escape.sub('', content.read().decode('utf8')) 

但我想知道在哪个Django的类或方法正在制作该信息!

回答

0

你知道Django是OSS,不是吗?答案以纯文本形式写入源代码django/core/management/commands/syncdb.py。对于Django的1.6.5,它的:

db = options.get('database') 
    connection = connections[db] 
    cursor = connection.cursor() 

    # Get a list of already installed *models* so that references work right. 
    tables = connection.introspection.table_names() 
    seen_models = connection.introspection.installed_models(tables) 

Django的1.7.x及以后你得看django/core/management/commands/migrate.py。这是一个更复杂的代码,但基本上你会想要像

from django.db.migrations.executor import MigrationExecutor 
    # Get the database we're operating from 
    db = options.get('database') 
    connection = connections[db] 
    executor = MigrationExecutor(connection) 
    print executor.loader.unmigrated_apps 
+0

我这样做。我正在搜索“同步”,“未同步”,“使用迁移”的源代码,这些代码没有显示任何内容。 – LarsVegas

相关问题