Obtener todos los nombres de tabla en una aplicación Django


¿Cómo obtener todos los nombres de tabla en una aplicación Django?

Utilizo el siguiente código pero no obtiene las tablas creadas por 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
Author: Brian Tompsett - 汤莱恩, 2009-12-04

4 answers

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

Como se ve en el comando syncdb para manage.py.

En un comentario a continuación, años después de la respuesta anterior, ThePhi dice (no lo he probado):

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()
 57
Author: cethegeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-09 19:57:44

La respuesta más simple, que aún le permite elegir qué aplicación desea, es modificar su código con un argumento adicional "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

Obviamente obtuve esto siguiendo el consejo de celope de leer la fuente de syncdb, así que gracias por eso, simplemente documentando una respuesta exacta que incluye el nombre de la aplicación, ya que era lo que quería y posiblemente otros también en el futuro.

 9
Author: George Lund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-22 11:02:35

El método más sencillo debería ser usar las API de reflexión de la base de datos en django para ir directamente a la base de datos. El inconveniente de esto es que no te dará ninguna tabla antes de que hayas sincronizado.

 0
Author: boxed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-04 10:58:14

Esto funciona para

>>> python -m django version
2.0.7

OK, así es como lo haces:

>>> from django.apps import apps 
>>> polls_tables = apps.get_app_config("polls")
>>> polls_tables.models
OrderedDict([('question', <class 'polls.models.Question'>), ('choice', <class 'polls.models.Choice'>), ('reporter', <class 'polls.models.Reporter'>), ('article', <class 'polls.models.Article'>), ('publication', <class 'polls.models.Publication'>), ('publicationarticle_publications', <class 'polls.models.PublicationArticle_publications'>), ('publicationarticle', <class 'polls.models.PublicationArticle'>), ('person', <class 'polls.models.Person'>), ('group', <class 'polls.models.Group'>), ('membership', <class 'polls.models.Membership'>), ('place', <class 'polls.models.Place'>), ('restaurant', <class 'polls.models.Restaurant'>), ('waiter', <class 'polls.models.Waiter'>), ('student', <class 'polls.models.Student'>), ('assembler', <class 'polls.models.Assembler'>), ('bike', <class 'polls.models.Bike'>), ('blog', <class 'polls.models.Blog'>), ('author', <class 'polls.models.Author'>), ('entry_authors', <class 'polls.models.Entry_authors'>), ('entry', <class 'polls.models.Entry'>), ('themeblog', <class 'polls.models.ThemeBlog'>), ('bookauthor', <class 'polls.models.BookAuthor'>), ('publisher', <class 'polls.models.Publisher'>), ('book_authors', <class 'polls.models.Book_authors'>), ('book', <class 'polls.models.Book'>), ('store_books', <class 'polls.models.Store_books'>), ('store', <class 'polls.models.Store'>), ('dummy', <class 'polls.models.Dummy'>)])
>>> polls_tables.models.keys()
odict_keys(['question', 'choice', 'reporter', 'article', 'publication', 'publicationarticle_publications', 'publicationarticle', 'person', 'group', 'membership', 'place', 'restaurant', 'waiter', 'student', 'assembler', 'bike', 'blog', 'author', 'entry_authors', 'entry', 'themeblog', 'bookauthor', 'publisher', 'book_authors', 'book', 'store_books', 'store', 'dummy'])

También puede obtener nombres de campo de un modelo particular

>>> questionTable = polls_tables.get_model("question")
>>> questionTable._meta.get_fields()
(<ManyToOneRel: polls.choice>, <django.db.models.fields.AutoField: id>, <django.db.models.fields.CharField: question_text>, <django.db.models.fields.DateTimeField: pub_date>)

Además, si quieres puedes obtener la cuenta por

>>> len(questionTable._meta.get_fields())
4

Para obtener todos los valores en la base de datos, puede hacerlo de la siguiente manera:

>>> list = [entry for entry in Entry.objects.values()]
>>> for dict in list:
...     print()
...     for key in dict:
...             print(key," : ", dict[key]) 
... 

id  :  1
blog_id  :  5
headline  :  i have blog entry named DJANGO
pub_date  :  2018-06-10
n_comments  :  5
n_pingbacks  :  1

id  :  2
blog_id  :  5
headline  :  i have blog entry named DJANGO
pub_date  :  2018-06-10
n_comments  :  7
 0
Author: Gambitier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-22 11:15:51