Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django中获取模型字段及其关系?_Python_Django_Dictionary - Fatal编程技术网

Python 如何在django中获取模型字段及其关系?

Python 如何在django中获取模型字段及其关系?,python,django,dictionary,Python,Django,Dictionary,使用以下代码,我可以获得列表中字段的dict: from django.db import connection table_info = [] tables = connection.introspection.table_names() seen_models = connection.introspection.installed_models(tables) for model in seen_models: table = model._meta.db_table c

使用以下代码,我可以获得列表中字段的dict:

from django.db import connection

table_info = []
tables = connection.introspection.table_names()
seen_models = connection.introspection.installed_models(tables)
for model in seen_models:
    table = model._meta.db_table
    columns = [field.column for field in model._meta.fields]
    table_info.append((table, columns))
从上面我可以得到一个json编码的文件,如:

["account_profile",["id","avatar","owner_id","forums","forum_threads","lct_discussion","organization_id","created_at","updated_at"]]
注意
owner\u id
是一个相关项,我想提取所有相关项并创建一个嵌套数组。我不确定如何修改上述代码来实现这一点。有什么建议吗?

您可以使用检查字段是否与另一个模型相关,并使用与此处相同的方法检查字段


我认为最好的解决方案是编写一个递归函数,但要注意模型之间的循环关系。

我是这样解决的:

    table_info = []
    tables = connection.introspection.table_names()
    seen_models = connection.introspection.installed_models(tables)
    for model in seen_models:
        table = model._meta.db_table
        columns = [field.column for field in model._meta.fields]

        # Identify a related field item:
        # Use this to get the related table details
        # Loop the table details and append the columns to the main table columns
        # Results to a nested list with depth of 1
        for field in model._meta.fields:
            if field.get_internal_type() == "ForeignKey":
                related_obj = field.rel.to
                related_table = related_obj._meta.db_table
                columns.append((related_table, [x.column for x in related_obj._meta.fields]))

        table_info.append((table, columns))

注意:我不想像@ahumeau所提到的那样,为了避免循环关系而递归地执行此操作。这很适合我现在的需要。它给了我1的深度,即看不到第一项的更远。

您检查过了吗?我不知道它是否适合你的需要,但它是一个有用的工具。我查看了它,但我不喜欢UI。我想要的东西,以及与我的管理界面设计融合,而不是出现完全不同的东西。我觉得也没那么简单。