使用以下代码,我可以在列表中获得字段的字典:
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_id
是一个相关项目,我想拉出所有相关项目并创建一个嵌套数组作为结果。我不确定如何修改上面的代码来实现这一点。有什么建议吗?
答案 0 :(得分:0)
您可以使用Field.is_relation检查字段是否与其他模型有关,并检查Field.related_model字段的方式与此处相同。
我认为最好的解决方案是编写递归函数,但要注意模型之间的循环关系。
答案 1 :(得分:0)
我已经这样解决了:
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,即没有进一步看第一项。