2015-06-11 3 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')) 

Но я хочу знать, в каком Джанго класс или метод этой информации производится!

ответ

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) 

Для Джанго 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

Я делаю. Я искал исходный код для «synced», «Not synced», «use migrations», который ничего не отображал. – LarsVegas