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

无需运行Django服务,如何获取模型字段信息并保存结果?

问题描述

我已经完成Django模型的全部代码编写,想要获取模型信息,比如通过以下代码获取字段名称:

for f in myModel._meta.fields:
    print(f.get_attname())

请问是否可以通过外部Python脚本实现该操作,无需运行Django服务?同时也希望了解其他可自动化完成并将结果保存至文件的方法。


我的尝试

尝试1

我使用Docker,启动容器后进入Python Shell执行以下操作:

>>> from django.conf import settings
>>> settings.configure()
>>> import models

出现报错:django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

尝试2

根据建议尝试使用自定义管理命令,创建了如下目录结构:

users/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            _private.py
            modelInfo.py

在modelInfo.py中编写代码:

from django.core.management.base import BaseCommand, CommandError
from users import views2

def savelisttxtfile(the_list, path_, type_='w', encoding="utf-8"):
    with open(path_, type_, encoding=encoding) as file_handler:
        for item in the_list:
            file_handler.write("{}\n".format(item))

class Command(BaseCommand):
    def handle(self, *args, **options):
        dic=[]
        for f in views2.ChertModel._meta.fields:
            print(f.get_attname())
            dic.append(f.get_attname())
        savelisttxtfile(dic,"F:\projects\sd.txt")

随后在另一个Python文件中执行:

os.chdir(r'F:\projects\users\management\commands')
from subprocess import run
import sys
run([sys.executable, r'F:\projects\users\management\commands\modelInfo.py'])

返回结果:

CompletedProcess(args=['C:\\ProgramData\\Anaconda3\\python.exe', 'F:\projects\users\management\commands\modelInfo.py'], returncode=1)

且结果未保存到sd.txt文件中。


解决方案

方法1:外部Python脚本直接实现(无需运行Django服务)

要在外部脚本中访问Django模型,必须完整初始化Django环境,而非仅调用settings.configure()。步骤如下:

  1. 编写外部脚本(例如get_model_fields.py):
import os
import django
from django.conf import settings

# 配置Django环境,替换为你的项目settings模块路径
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名.settings')
django.setup()

# 导入目标模型
from users.models import ChertModel

# 导出字段到文件
def save_fields_to_file(model, file_path):
    fields = [f.get_attname() for f in model._meta.fields]
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write('\n'.join(fields))

if __name__ == '__main__':
    # 使用正斜杠或双反斜杠避免转义问题
    save_fields_to_file(ChertModel, 'F:/projects/sd.txt')
  1. 运行脚本:在项目根目录下执行python get_model_fields.py(Docker容器内需进入对应路径执行)。

方法2:正确使用自定义管理命令

自定义管理命令不能直接运行脚本,必须通过Django的manage.py调用,修正步骤如下:

  1. 调整modelInfo.py代码(直接从models导入模型,避免依赖视图):
from django.core.management.base import BaseCommand
from users.models import ChertModel

def savelisttxtfile(the_list, path_, type_='w', encoding="utf-8"):
    with open(path_, type_, encoding=encoding) as file_handler:
        for item in the_list:
            file_handler.write("{}\n".format(item))

class Command(BaseCommand):
    help = '导出模型字段信息到文件'

    def handle(self, *args, **options):
        dic = [f.get_attname() for f in ChertModel._meta.fields]
        self.stdout.write('\n'.join(dic))
        # 使用正斜杠避免转义问题
        savelisttxtfile(dic, "F:/projects/sd.txt")
  1. 调用命令:在项目根目录下执行python manage.py modelInfo(Docker容器内进入项目根目录执行)。

错误原因说明

  1. 尝试1报错:仅调用settings.configure()无法完成Django应用的注册加载,必须通过django.setup()完成完整初始化。
  2. 尝试2失败:直接运行modelInfo.py不会触发Django管理命令的初始化逻辑,导致环境未加载;同时路径使用单反斜杠会被解析为转义字符,需改用正斜杠或双反斜杠。

内容的提问来源于stack exchange,提问作者Farhang Amaji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:57:32