2015-06-11 35 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

相關問題