44 votes

Obtenir tous les noms de tables dans une application Django

Comment obtenir tous les noms de tables dans une application Django ?

J'utilise le code suivant mais il ne récupère pas les tables créées par 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

76voto

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

Comme le montre la commande syncdb de manage.py.

Dans un commentaire ci-dessous, des années après la réponse ci-dessus, LePhi dit (je ne l'ai pas testé) :

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()

Un autre utilisateur indique que cela fonctionne également (non testé) :

[ m._meta.db_table for c in apps.get_app_configs() for m in c.get_models() ]

Un autre recommande de lire cette réponse :

Django obtient la liste des modèles dans l'application

10voto

George Lund Points 776

La réponse la plus simple, qui vous permet toujours de choisir l'application que vous voulez, est de modifier votre code avec un argument supplémentaire "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

Évidemment, j'ai obtenu ce résultat en suivant le conseil de celope de lire la source de syncdb, donc merci pour cela - je documente juste une réponse exacte qui inclut le nom de l'application car c'est ce que je voulais et peut-être d'autres aussi à l'avenir.

2voto

Gambitier Points 23

Cela fonctionne pour

>>> python -m django version
2.0.7

Voici comment procéder :

>>> 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'])

vous pouvez également obtenir les noms des champs d'un modèle particulier

>>> 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>)

De plus, si vous le souhaitez, vous pouvez en obtenir le décompte en

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

Pour obtenir toutes les valeurs de la base de données, vous pouvez procéder comme suit :

>>> 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

0voto

boxed Points 748

La méthode la plus simple consiste à utiliser les API de réflexion sur les bases de données de django pour accéder directement à la base de données. L'inconvénient de cette méthode est qu'elle ne vous donnera aucune table avant la synchronisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X