You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何获取指定SQL表所有列名且无需在model.py中预定义字段

可以实现,无需提前在models.py中定义所有对应字段,即可获取指定SQL表的全部列名,以下是两种常用的稳定实现方案:

方案1:直接通过Django数据库连接查询系统表

该方案完全不依赖Django的Model定义,直接从数据库的系统表读取列信息,适合没有对应基础Model的场景。

MySQL环境示例代码

from django.db import connection

def get_mysql_table_columns(table_name: str) -> list:
    with connection.cursor() as cursor:
        # 参数化查询避免SQL注入风险
        cursor.execute("DESCRIBE %s", [table_name])
        # 返回结果的第一字段即为列名
        columns = [row[0] for row in cursor.fetchall()]
    return columns

PostgreSQL环境示例代码

def get_postgresql_table_columns(table_name: str) -> list:
    with connection.cursor() as cursor:
        cursor.execute("SELECT column_name FROM information_schema.columns WHERE table_name = %s", [table_name])
        columns = [row[0] for row in cursor.fetchall()]
    return columns

注意:不同数据库的系统表查询语法存在差异,需要跨数据库兼容时优先使用第二种方案。

方案2:通过Django内置内省接口获取(跨数据库兼容)

如果已经定义了对应表的基础Model(哪怕只定义了部分字段),可以使用Django自带的数据库内省工具获取全列,自动适配所有Django支持的数据库类型。

from django.db import connection
from yourapp.models import YourBaseModel

def get_all_columns_by_model(model) -> list:
    introspector = connection.introspection
    table_name = model._meta.db_table
    with connection.cursor() as cursor:
        table_description = introspector.get_table_description(cursor, table_name)
    # 提取所有列名
    columns = [field.name for field in table_description]
    return columns

Django后台动态展示列的补充实现

如果需要在Django Admin面板动态展示新增的列,可以重写Admin类的get_list_display方法动态拼接展示字段:

from django.contrib import admin
from .models import YourBaseModel
from .utils import get_all_columns_by_model

@admin.register(YourBaseModel)
class DynamicColumnAdmin(admin.ModelAdmin):
    def get_list_display(self, request):
        # 动态获取当前表的所有列
        all_columns = get_all_columns_by_model(YourBaseModel)
        # 可在此处过滤不需要展示的字段,例如id、is_deleted等
        # filtered_columns = [col for col in all_columns if col not in ["id", "is_deleted"]]
        return all_columns

注意:未在Model中定义的字段需要额外处理展示逻辑,可通过重写Model的__getattr__方法读取原始数据避免后台报错。


内容的提问来源于stack exchange,提问作者Kullaleeni Siritharran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 08:54:00