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
相关产品推荐
相关产品推荐

