获取Django应用中所有表名
如何获取Django应用中的所有表名?
我用以下代码,但它没有获取到通过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
4 个回答
2
这个方法适用于
>>> python -m django version
2.0.7
好的,下面是你怎么做的:
>>> 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'])
你还可以获取特定模型的字段名称
>>> 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>)
如果你想的话,还可以通过以下方式获取数量:
>>> len(questionTable._meta.get_fields())
4
要获取数据库中的所有值,你可以这样做:
>>> 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
11
最简单的办法,让你可以选择想要的应用,就是在你的代码里加一个额外的参数“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
显然,我是根据celope的建议去查看syncdb的源代码才知道这个的,所以在这里感谢他——我只是记录下这个确切的答案,因为它包含了应用的名称,这正是我想要的,未来可能也会对其他人有帮助。
88
这段代码会给你所有的表名,就像提问者想要的那样:
from django.apps import apps
tables = [m._meta.db_table for c in apps.get_app_configs() for m in c.get_models()]
这段代码会给你所有的模型名:
from django.db import connection
tables = connection.introspection.table_names()
seen_models = connection.introspection.installed_models(tables)
这段代码会按应用给你所有的模型名:
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()
额外阅读
还有另外一个推荐阅读这个答案: