Кажется, django поддерживает внутренний кеш приложений и их моделей. Именно отсюда он узнает, создал ли он уже таблицу для модели или нет. Я полагаю, именно поэтому существует поддержка самоанализа., чтобы модели создавались из существующих схем, а кэш заполнялся надлежащим образом.
Из источника syncdb это Ясно, каков процесс, чтобы выяснить, что нужно сделать на syncdb:
# Get a list of already installed *models* so that references work right.
tables = connection.introspection.table_names()
seen_models = connection.introspection.installed_models(tables)
created_models = set()
pending_references = {}
# Build the manifest of apps and models that are to be synchronized
all_models = [
(app.__name__.split('.')[-2],
[m for m in models.get_models(app, include_auto_created=True)
if router.allow_syncdb(db, m)])
for app in models.get_apps()
]
def model_installed(model):
opts = model._meta
converter = connection.introspection.table_name_converter
return not ((converter(opts.db_table) in tables) or
(opts.auto_created and converter(opts.auto_created._meta.db_table) in tables))
manifest = SortedDict(
(app_name, list(filter(model_installed, model_list)))
for app_name, model_list in all_models
)
В каждом драйвере базы данных есть код для получения имен таблиц. Это для postgresql:
def get_table_list(self, cursor):
"Returns a list of table names in the current database."
cursor.execute("""
SELECT c.relname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'v', '')
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)""")
return [row[0] for row in cursor.fetchall()]
person
Burhan Khalid
schedule
06.05.2013
INSERT INTO ... VALUES ...
и создать из него фикстуры. Вас также может заинтересовать (Юг)[south.aeracode.org/] для миграций в базе данных . Я всегда стараюсь не использовать его до производства. - person toto_tico   schedule 28.03.2013I manually created the model too
- person Burhan Khalid   schedule 06.05.2013