django 收集各个表的信息

本文介绍了一个使用Django框架实现的展示所有已安装应用中模型信息的方法,包括模型的数据库表名、字段类型及说明等详细信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
import traceback

from django.db.models import get_app,Model
from django.conf import settings
from django.http import HttpResponse
import settings


def db_info(request):
    models = {}
    for app_name in settings.INSTALLED_APPS:
        try:
            app_name = app_name.split(".")[-1]
            app = get_app(app_name)
            app_models = []
            app_verbose_name = u"%s"%app.verbose_name if hasattr(app,"verbose_name") else u"没有配置说明{rd}".format(rd=app_name)
            for att in dir(app):
                try:
                    m = getattr(app,att)
                    if issubclass(m,Model)  and (m._meta.app_label == app_name or m._meta.app_label == "auth"):
                        m_info = {
                            "dbname":settings.DATABASES[m.Admin.using_db]["NAME"] if  hasattr(m,"Admin") else settings.DATABASES["default"]["NAME"],
                            "db_table":m._meta.db_table,
                            "verbose_name":u"%s"%m._meta.verbose_name,
                            "fields":[]
                        }
                        for f in m._meta.fields:
                            db_name = f.get_attname_column()[1]
                            verbose_name = u"%s"%f.verbose_name
                            db_type = f.get_internal_type()
                            max_length = f.max_length if f.max_length  else ""
                            help_text = f.help_text
                            m_info["fields"].append({
                                    "db_name":db_name,
                                    "verbose_name":verbose_name,
                                    "db_type":db_type,
                                    "max_length":max_length,
                                    "help_text":help_text,
                            })

                        app_models.append(m_info)
                except:
                    pass
                    #traceback.print_exc()
                    
            if app_models:
                models[app_verbose_name] = app_models
        except:
            traceback.print_exc()

    model_table_html = u"""
        <div>
            数据库名称:%(dbname)s
            模型名称:%(verbose_name)s
            数据库表名称:%(db_table)s
        </div>
        <table class="table">
            <thead>
                <th>数据库字段</th>
                <th>字段说明</th>
                <th>字段类型</th>
                <th>字段长度(数字类型为空)</th>
                <th>字段详细说明</th>
            </thead>
            <tbody>
                %(body)s
            </tbody>
        </table>
        <br/><br/>
    """

    html = u"""
        <html>
            <head>
                <style>
                    .table,.table tbody td, .table thead th {
                        border-color: #CDD7E3;
                        border-style: solid;
                    }
                    table thead{background-color:silver;}
                    .table{border-width: 1px 0 0 1px !important;border-spacing: 0;}
                </style>
            </head>
            <body>
            %(body)s
            </body>
        </html>
    """


    apps_html = []

    for app_verbose_name,tables in models.items():
        all_models_html = [u"""<div style="color:blue">子系统*********%s************</div>"""%app_verbose_name]
        for table in tables:
            verbose_name = table["verbose_name"]
            db_table = table["db_table"]
            dbname = table["dbname"]
            bodys = []
            for f in table["fields"]:
                #print 'f f["help_text"]===',app_verbose_name,verbose_name,f["db_name"],f["help_text"]
                bodys.append(u"""
                    <tr>
                        <td>%(db_name)s</td>
                        <td>%(verbose_name)s</td>
                        <td>%(db_type)s</td>
                         <td>%(max_length)s</td>
                        <td>%(help_text)s</td>
                    </tr>
                """%{
                     "db_name":f["db_name"],
                     "verbose_name":f["verbose_name"],
                     "db_type":f["db_type"],
                     "max_length":f["max_length"],
                     "help_text":f["help_text"],
                 }
            )
            
            m_html = model_table_html%{
                    "body":u"".join(bodys),
                    "verbose_name":verbose_name,
                    "db_table":db_table,
                    "dbname":dbname,
            }
            all_models_html.append(m_html)

        apps_html.append(u"".join(all_models_html))

    return HttpResponse(html%{"body":u"".join(apps_html)})




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值