2009-12-04 11 views
32

Come ottenere tutti i nomi di tabella in un'app Django?Ottieni tutti i nomi di tabella in un'app di Django

Io uso il seguente codice, ma non ottiene le tabelle create da ManyToManyField

from django.db.models import get_app, get_models 
app = get_app(app_name) 
for model in get_models(app): 
    print model._meta.db_table 

risposta

54
from django.db import connection 
tables = connection.introspection.table_names() 
seen_models = connection.introspection.installed_models(tables) 

Come visto nel comando syncdb per manage.py.

In un commento qui sotto, anni dopo la risposta di cui sopra, ThePhi dice (non ho provato):

from django.apps import apps 
from django.contrib import admin 
from django.contrib.admin.sites import AlreadyRegistered 

app_models = apps.get_app_config('my_app').get_models() 
+0

Modificato per includere il meccanismo per ottenere solo i modelli di app installati. Consiglio vivamente di guardare il codice comando syncdb. – cethegeek

+0

Questa risposta elenca tutte le tabelle che il mio django ha mai usato, comprese quelle create da app che erano una volta in INSTALLED_APPS ma non lo sono più. C'è un modo per scoprire quelli che sono attualmente rilevanti? – GreenAsJade

+0

Per riferimenti futuri: https://stackoverflow.com/a/31184258/1937033 Da Django 1.7 in poi, è possibile utilizzare questo codice, ad esempio in admin.py per registrare tutti i modelli: 'dalle app di importazione di django.apps da django.contrib import admin dalla django.contrib.admin.sites importare AlreadyRegistered app_models = apps.get_app_config ('my_app') get_models() per il modello in app_models:. prova: admin.site.register (modello) tranne AlreadyRegistrato: pass' – ThePhi

0

Il metodo più semplice dovrebbe essere quello di utilizzare le API del database di riflessione in Django per andare direttamente al database. Lo svantaggio di questo è che non ti darà alcuna tabella prima che tu abbia sincronizzato.

9

La risposta più semplice, che permette comunque di scegliere quale applicazione che si desidera, è quello di modifica il tuo codice con un argomento extra "include_auto_created".

from django.db.models import get_app, get_models 
app = get_app(app_name) 
for model in get_models(app, include_auto_created=True): 
    print model._meta.db_table 

Ovviamente ho ottenuto questo, seguendo il consiglio di celope a leggere la fonte syncdb, quindi grazie per questo - solo che documentano una risposta esatta che include il nome dell'applicazione come era quello che volevo e possibilmente anche gli altri in futuro.

Problemi correlati