获取 Django 应用程序中的所有表名

Posted

技术标签:

【中文标题】获取 Django 应用程序中的所有表名【英文标题】:Get all table names in a Django app 【发布时间】:2010-12-23 03:36:42 【问题描述】:

如何在 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

【问题讨论】:

【参考方案1】:

最简单的方法应该是使用django中的数据库反射API直接进入数据库。这样做的缺点是它不会在您同步之前为您提供任何表格。

【讨论】:

【参考方案2】:
from django.db import connection
tables = connection.introspection.table_names()
seen_models = connection.introspection.installed_models(tables)

如 manage.py 的 syncdb 命令所示。

在上面的答案多年后,ThePhi 在下面的评论中说(我还没有测试过):

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

另一个用户认为这也有效(也未经测试):

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

还有一个建议阅读这个答案:

Django get list of models in application

【讨论】:

已编辑以包含仅获取已安装应用程序模型的机制。我真的建议查看 syncdb 命令代码。 此答案列出了我的 django 曾经使用过的所有表,包括由曾经在 INSTALLED_APPS 但不再存在的应用程序创建的表。有没有办法找出当前相关的那些? 它通过我的测试工作,1.11。但是,请注意 app_models 是一个只能迭代一次的可迭代对象,因此最好使用 app_models = list(app_models) 以提高持久性。 您可以通过以下方式列出所有表名:[ m._meta.db_table for c in apps.get_app_configs() for m in c.get_models() ] @NegaOverflow,据我所知,这样的文档不存在。但是您可以在此处阅读代码(对于 mysql):github.com/django/django/blob/master/django/db/backends/mysql/…,对于其他数据库,请从此处开始:github.com/django/django/tree/master/django/db/backends 并导航到您已知的后端并打开 introspection.py。祝你好运。【参考方案3】:

仍然允许您选择所需应用的最简单答案是使用一个额外的参数“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 源代码得到的,所以谢谢你 - 只是记录一个包含应用程序名称的确切答案,因为它是我想要的,将来可能还有其他人。

【讨论】:

【参考方案4】:

这适用于

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

【讨论】:

以上是关于获取 Django 应用程序中的所有表名的主要内容,如果未能解决你的问题,请参考以下文章

django在html之间传递变量

Django 1.6:清除一张表中的数据

django_orm 基本操作

如何获取django应用程序中所有视图的列表?

使用c#获取数据库中的所有表名

通过 SQL 查询获取特定数据库的所有表名?