预计阅读时间：25-35 分钟。本文包含 macOS 和 Windows 平台的配置方法，您可以根据您的操作系统选择阅读相应部分。实际操作中，软件下载和安装可能需要额外时间。开始之前在开始配置之前，我们先简单了解几个基本概念，这会让你对接下来的操作更有数。什么是 ODBC？我为什么需要它？ODBC (Open Database Connectivity)：你可以把它想象成一个通用的“翻译官”或“适配器”。很多不同的应用程序（比如我们这里的 Python/Django）想要和各种不同的数据库（比如 SQL Server、Oracle、MySQL 等）“对话”。ODBC 提供了一套标准的接口（API），让应用程序可以用一种统一的方式来请求数据，而不用关心底层数据库的具体实现细节。为什么需要？ 对于某些数据库（尤其是像 SQL Server 这样的商业数据库），Python 的数据库驱动（比如 pyodbc 或 Django 使用的 mssql-django 后端间接依赖的驱动）会通过 ODBC 来与数据库通信。ODBC 驱动程序由数据库厂商（如微软）或第三方提供，并安装在你的操作系统上。为什么 Java 连接数据库好像不太需要 ODBC，但 Python 有时需要？Java 有 JDBC (Java Database Connectivity)：Java 生态系统中有其自己的一套标准接口 JDBC。数据库厂商通常会提供纯 Java 的 JDBC 驱动程序，这些驱动程序直接实现了与数据库通信的协议，所以它们不依赖操作系统层面的 ODBC。Python 的情况：Python 也有很多数据库的直接驱动程序（比如 psycopg2 for PostgreSQL, mysqlclient for MySQL），它们可能不依赖 ODBC。但对于 SQL Server，一种常见的连接方式就是通过 ODBC。Django 在连接 SQL Server 时，其后端库（如 mssql-django）通常会利用系统上已安装的 ODBC 驱动。本文会用到哪些 ODBC 相关程序/驱动？在 macOS 上连接 SQL Server：我们会使用 unixODBC：一个开源的 ODBC 管理器，相当于 Windows 上的 ODBC 数据源管理器。以及 FreeTDS：一个开源的驱动程序，让 macOS/Linux 系统能够连接到 SQL Server。在 Windows 上连接 SQL Server：我们会使用 Windows 系统自带的 “ODBC 数据源管理器”。以及微软官方提供的 “ODBC Driver for SQL Server” (例如 ODBC Driver 17/18 for SQL Server)。关于 Oracle 连接：本文后续展示的 Django 连接 Oracle 的示例，将采用 Oracle 特有的连接字符串方式，它不依赖于我们前面为 SQL Server 配置的 ODBC，而是通过 Django 的 Oracle 后端直接与 Oracle 客户端库（如果需要）或数据库通信。简单来说，ODBC 就像一座桥梁，帮助我们的 Python/Django 应用连接到特定类型的数据库。接下来的内容，我们将一步步教你如何在你的 Mac 或 Windows 系统上搭建这座“桥梁”来连接 SQL Server，并配置 Django 项目使用它。Mac系统连接SQLServer本章节描述的在macOS上使用 unixODBC 和 FreeTDS 连接SQL Server的配置流程，其核心原理和步骤与在Linux系统上操作非常相似。主要区别在于软件包的安装命令（例如，您会使用 apt、yum 或 dnf 而不是 brew）以及配置文件的默认存放路径。理解了macOS的配置过程后，您可以触类旁通地在Linux上完成类似配置。Mac：系统版本Sonoma14.5；brew4.4.6SQLServer：2019版本（容器镜像为mcr.microsoft.com/mssql/server:2019-latest）brew install unixodbc brew install freetds open -e /opt/homebrew/etc/odbcinst.ini # 编辑文件 # 在文件末尾输入下面的内容，用来将FreeTDS注册到unixodbc中 [FreeTDS] Description=FreeTDS Driver Driver=/opt/homebrew/lib/libtdsodbc.so open -e /opt/homebrew/etc/odbc.ini # 编辑文件 # 在文件末尾输入下面的内容，请根据你实际要连接的数据库配置Server、Port和Database # 如果你使用的SQLServer版本较老，TDS_Version可尝试小一点的版本，例如7.0 [djangoadmindemo] Driver=FreeTDS Server=127.0.0.1 Port=7011 Database=djangoadmin TDS_Version=7.4 你可以使用下面的命令来验证ODBC是否配置正确export ODBCSYSINI=/opt/homebrew/etc export ODBCINI=/opt/homebrew/etc/odbc.ini odbcinst -q -s # 如果配置正确，会列出你配置的所有数据源名称 isql -v djangoadmindemo sa ******** # 使用指定的用户和密码连接djangoadmindemo数据源Django项目配置文件中，数据库连接配置的OPTIONS参考下面的写法DATABASES = { 'default': { ...... 'OPTIONS': { "driver": "FreeTDS", 'dsn': "djangoadmindemo", }, } }Windows系统连接SQLServerWindows：win10专业版SQLServer：2019版本（容器镜像为mcr.microsoft.com/mssql/server:2019-latest）驱动下载和安装点击下面的链接，选择合适的版本进行下载：Download ODBC Driver for SQL Server - ODBC Driver for SQL Server | Microsoft Learn安装完成后，按win+R，输入odbcad32，打开ODBC数据源管理程序：点击添加，如果你的SQLServer版本比较新，就选择ODBC Driver 18 for SQL Server，如果很老，就选择SQL Server。注意：服务器的IP和端口之前请用逗号,分割，不要用冒号:一直点下一步，最后点击测试数据源。如果提示“证书链是由不受信任的颁发机构颁发的。”，可以返回上一步，勾选“信任服务证书”Django项目配置文件中，数据库连接配置的OPTIONS参考下面的写法，driver对应上图的驱动程序，dsn对应上图的名称。DATABASES = { 'default': { ...... 'OPTIONS': { "driver": "ODBC Driver 18 for SQL Server", 'dsn': "djangoadmindemo", }, } }连接ORACLEOracle：23版本（容器镜像为gvenzl/oracle-free:23）（注：Django5.0和Django4.X都要求Oracle版本为19c或更高）请参考下面的示例进行配置： 'default': { 'ENGINE': 'django.db.backends.oracle', 'NAME': ( "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=162.105.132.198)(PORT=7012))" "(CONNECT_DATA=(SERVICE_NAME=FREEPDB1)))" ), # ORACLE的连接描述，如果你配置了tnsnames.ora，你可以在这里只指定服务名的名称 'USER': 'djangoadmin', 'PASSWORD': '**********', }
预计阅读时间：30-45 分钟。如果您是新手并跟随步骤实际操作，可能需要更多时间。开始之前在正式踏上 Django Admin 的学习之旅前，我们先花几分钟明确几个基本问题。这会帮助你更好地理解 Django Admin 是什么，它能做什么，以及它在整个 Django 生态中的位置。同时，我会用最简洁的语言告诉你使用 Django Admin 的核心思路。Django Admin有什么用？简单来说，Django Admin 是一个非常强大且方便的工具，它能帮你快速生成一个功能完善的数据管理后台。想象一下，你的网站或应用需要管理用户信息、用户权限、下拉菜单的选项、网站的公告。在传统开发模式下，这些都需要你手动编写前端页面、后端接口逻辑，并处理数据的增删改查。而使用 Django Admin：你几乎不需要编写任何前端界面代码（HTML, CSS, JavaScript）或复杂的后端视图逻辑。你只需要专注于定义你的数据模型 (Models) —— 也就是告诉 Django 你的数据长什么样。然后通过一些简单的配置 (Admin classes)，Django Admin 就能自动为你生成一个专业的、可定制的管理界面。管理员可以直接在这个界面上进行数据的增、删、改、查操作，无需开发人员直接操作数据库，既安全又高效。它特别适合数据驱动的管理任务。如果你的业务系统主要就是对各种数据对象进行维护，或者你需要在主业务系统之外快速搭建一个后台管理工具来维护一些配置数据、辅助数据，那么 Django Admin 会是一个极佳的选择。当然，对于那些业务流程非常复杂、交互逻辑高度定制的应用，Django Admin 可能不是直接的解决方案，但它仍然可以作为系统的一部分发挥重要作用。Django和Django Admin有什么关系？首先，你需要知道 Django 是一个高级的 Python Web 框架。它鼓励快速开发和简洁、实用的设计。你可以用 Django 来构建各种复杂的 Web 应用，从简单的博客到大型电商平台，甚至是你正在使用的业务系统（如果它是 Python 开发的话）。Django 负责处理请求、响应、数据库交互、模板渲染等 Web 开发的方方面面。Django Admin 则是 Django 框架内置的一个强大应用（app）。你可以把它想象成 Django 这个“大工具箱”里的一件“超级工具”。当你创建一个 Django 项目时，Admin 功能就已经准备好了，你只需要激活并配置它，就能享受到它带来的便利。它充分利用了 Django 的模型层 (Models)、表单 (Forms)、认证授权 (Auth) 等核心组件，是 Django “ Batteries included ”（自带电池，开箱即用）理念的完美体现。所以，Django 是一个全功能的 Web 框架，而 Django Admin 是这个框架中一个专注于快速生成数据管理后台的子系统或应用。Django Admin的核心用法如果你想用一两句话理解 Django Admin 的核心用法，那就是：定义你的数据长什么样 (Models)：用 Python 代码描述你想要管理的数据结构（比如一个“学生”信息表，包含姓名、学号、班级等字段）。告诉 Admin 如何展示和管理这些数据 (Admin Classes)：通过简单的配置，告诉 Django Admin 你希望在管理后台如何显示这些“学生”信息，比如列表页显示哪些字段、哪些字段可以搜索、哪些字段可以作为筛选条件等。就这么简单！ 完成这两步，Django Admin 就会自动为你生成一个功能齐全的网页界面，你可以通过浏览器访问它，对“学生”数据进行添加、查看、修改和删除操作，完全不需要你写一行 HTML 或 JavaScript！接下来的教程，就会带你一步步实践这个过程。Conda安装方法conda是Python的包管理和环境管理软件，可以让你的电脑安装多个Python环境，这样你可以同时开发多个Python项目而不冲突。这是conda的官方网站，根据自己的系统下载相应的安装包并进行安装即可：Download Now | Anaconda （如果需要图形页面就安装Anaconda，不需要就安装Miniconda）安装成功后，你可以打开命令行并运行conda env list 来验证你是否安装成功，如果安装成功，这条命令会列出一个名为base的Python环境，它是conda安装后自动创建的Python环境。Conda用法下面列出了一些常见的conda命令。你可以先跳过这部分，等用到的时候再回来查查看。环境管理命令创建新环境：conda create --name myenv激活环境：conda activate myenv ，激活名为 myenv 的环境，使其成为当前会话的活动环境。此时你在命令行中的python会默认为myenv的python，pip安装的包也只会在myenv下安装。停用环境：conda deactivate ，停用当前激活的环境，返回到base环境或系统默认环境。列出所有环境：conda env list ，列出所有已创建的 Conda 环境。删除环境：conda remove --name myenv --all包管理命令注：你也可以用python自带的包管理工具pip，不一定要用conda安装包：conda install package-name在当前激活的环境中安装名为 package-name 的软件包。更新包：conda update package-name更新当前环境中名为 package-name 的软件包到最新版本。删除包：conda remove package-name 从当前环境中删除名为 package-name 的软件包。列出已安装的包：conda list列出当前环境中所有已安装的软件包及其版本信息。其他有用命令搜索包：conda search package-name搜索 Conda 仓库中可用的名为 package-name 的软件包。更新 Conda 自身：conda update conda更新 Conda 包管理器到最新版本。导出环境：conda env export > environment.yml将当前环境的配置信息导出到一个 environment.yml 文件中，可以用于在其他系统上重建环境。从文件创建环境：conda env create -f environment.yml使用 environment.yml 文件创建一个新的 Conda 环境。项目创建下面以项目名为LemisManage为例，请根据实际项目名称进行替换。创建项目环境：conda env create -f environment-common.yml -n LemisManage -n后面的是环境名称。在Pycharm中创建项目：项目创建后，你可以尝试直接运行项目，来验证项目及项目环境是否正常，如果正常，访问网站根路径你可以看到这样的页面：项目配置修改项目运行的端口号和绑定的IP点击pycharm右上角的Edit Configurations：在项目运行配置页面可以配置绑定的IP和端口号，如果你想绑定本机拥有的所有IP，就将图中的localhost改为0.0.0.0：项目配置文件项目配置文件位于LemisManage/settings.py （相当于Springboot的application.yml），你可以像正常的python文件一样在里面编写Python代码，这个文件里面的全局变量会作为配置项。下面列出了一些通用的配置，请你在配置文件中找到这些配置项并根据实际情况进行替换/新增： # 指定哪些主机名或域名可以合法地向 Django 应用发送请求 ALLOWED_HOSTS = ['*'] if DEBUG else [] INSTALLED_APPS = [ # 本项目的应用 # 第三方应用 "import_export", "simpleui", # Django自带应用 "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", ] # 指定项目默认的语言代码，Django自带国际化支持，例如Django Admin就支持很多语言 LANGUAGE_CODE = 'zh-hans' # Django也带有多时区的支持，这个配置项告诉Django本地的时间是什么时区 TIME_ZONE = 'Asia/Shanghai' # 不启用时区支持，如果你的应用只在中国使用，放心把这个关掉，省很多事 USE_TZ = False # 日志配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, # 是否禁用未在此处声明的所有日志记录器 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'level': 'WARNING', # 改为DEBUG可以看到执行的SQL 'handlers': ['console'], 'propagate': False, }, }, }数据库配置，默认情况下Django会使用SQLite作为数据库，如果你使用Django Admin来从头构建你的Web应用，那你完全可以直接使用默认的SQLite数据库，对于用户量最多为几百的情况是完全够用的。下面以SQLServer为例进行展示，OPTIONS用于配置数据库驱动，这和你的操作系统和连接的数据库有关，具体请参考另一篇文章《ODBC安装及Django配置》，你也可以参考Django数据库配置（Django官方文档，包含Django官方支持的PostgreSQL、MariaDB、MySQL、Oracle、SQLite）的配置方法：DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': 'djangoadmin', 'USER': 'sa', 'PASSWORD': '**********', 'HOST': '127.0.0.1', 'PORT': '7011', 'OPTIONS': { ...... }, } }配置完成后，请启动Django项目，Django会检查配置文件是否正确，数据库连接是否正常。数据库初始化Django默认安装的应用（可以在settings.py的INSTALLED_APPS中看到）提供了一些功能，这些功能需要创建数据表才能正常使用，请在Pycharm中打开终端：执行命令（注意，下面的命令会自动在数据库中创建表：auth_group、auth_group_permissions、auth_permission、auth_user、auth_user_groups、auth_user_user_permissions、django_admin_log、django_content_type、django_migrations、django_session）pip install django==5.0.6 --force-reinstall # 最新的5.1版本太新了，不兼容mssql后端 python manage.py makemigrations python manage.py migrate出现若干表示成功的OK提示：创建超级用户并登录在Pycharm的终端中，输入命令python manage.py createsuperuser ，按照提示输入信息访问/admin，登录到管理页面成功！创建你的应用和模型如果你正在使用Django Admin创建一个全新的数据管理应用，需要创建新的数据表，你可以这样做：在Pycharm的终端输入命令python manage.py startapp myapp以创建一个应用，myapp是应用名称，一个应用对应了一个业务。打开settings.py ，将应用添加在INSTALLED_APPS中：INSTALLED_APPS = [ # 本项目的应用 "myapp", ...... ]打开myapp/apps.py ，为应用添加一个人类友好的名字：from django.apps import AppConfig class MyappConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'myapp' verbose_name = "我的应用"打开myapp/models.py ，在这个文件中定义数据模型，一个数据模型对应一张数据表：from django.db import models # Create your models here. class Document(models.Model): doc_num = models.CharField("文档编号", max_length=32, db_index=True) # db_index=True表示为这个字段建立数据库索引 name = models.CharField("文档名称", max_length=50, blank=True, db_index=True) # blank=True表示用户填写表单时，这个字段不是必填项 count = models.PositiveIntegerField("数量", null=True, blank=True) # null=True表示在数据库表中，这个字段允许为NULL num_pages = models.PositiveIntegerField("页数", null=True, blank=True) storage_location = models.CharField("存放位置", max_length=200, blank=True, db_index=True) create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True) # auto_now_add表示创建对象时，自动将这个字段赋值为当前时间 class Meta: verbose_name = "文档" # 单数名称 verbose_name_plural = verbose_name # 复数名称 # 用于定义一个人类友好的字符串表示 def __str__(self): if self.name: return self.doc_num + " " + self.name else: return self.doc_num 若你不定义主键，Django会默认添加一个名为id的自增整数主键。创建好模型后，运行下面的命令，将模型同步到数据库中。python manage.py makemigrations # 生成描述模型变更的迁移文件(在应用的migrations文件夹中） python manage.py migrate # 读取迁移文件，同步到数据库迁移完成后，你可以在数据库中看到自动创建的数据表。模型默认的数据表名应用名_模型名小写 ，你可以在模型类的Meta中自定义db_table = "数据表名"将模型注册到Django Admin中打开myapp/admin.py，编写如下代码：from django.contrib import admin from .models import Document # Register your models here. @admin.register(Document) class DocumentAdmin(admin.ModelAdmin): list_display = ("doc_num", "name", "count", "num_pages", "storage_location", "create_time") # 按顺序展示这些列 search_fields = ("doc_num", "name") # 适合进行文本搜索的字段 list_filter = ("storage_location", ) # 适合用下拉菜单进行过滤的字段 list_per_page = 10 # 每页展示的数据条数你可以在Django管理站点找到更多的ModelAdmin配置访问/admin （你不需要手动重启服务器，只需刷新页面即可，因为Django检测到你修改了代码会自动重启）根据数据表反向得到模型的定义如果你已经有了一套成熟的web系统，只想用Django Admin实现数据管理功能，不需要创建新的数据表，你可以这样做：使用命令python manage.py inspectdb [数据表名] ，例如python manage.py inspectdb myapp_document ，然后Django会输出下面的内容：# This is an auto-generated Django model module. # You'll have to do the following manually to clean this up: # * Rearrange models' order # * Make sure each model has one field with primary_key=True # * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior # * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table # Feel free to rename the models, but don't rename db_table values or field names. from django.db import models class MyappDocument(models.Model): id = models.BigAutoField(primary_key=True) doc_num = models.CharField(max_length=32, db_collation='Chinese_PRC_CI_AS') name = models.CharField(max_length=50, db_collation='Chinese_PRC_CI_AS') count = models.IntegerField(blank=True, null=True) num_pages = models.IntegerField(blank=True, null=True) storage_location = models.CharField(max_length=200, db_collation='Chinese_PRC_CI_AS') create_time = models.CharField(max_length=27) class Meta: managed = False db_table = 'myapp_document'你可能需要对这些代码进行如下修改，以让Django Admin更好地理解和展示你的数据表：为每个字段添加一个人类友好的名称verbose_name = ""检查这些字段是否是正确的，例如上面的create_time应该是models.DateTimeField ，而不是models.CharField 。调整字段的blank = True/False ，如果它是必填的，设为False，如果不是必填的，设为True如果你保持Meta中的managed = False ，在执行manage.py makemigrations命令时不会自动检测这个模型的修改，也就是说Django不会将你在代码中对模型进行的修改同步到数据库中，你可以先保持这个设置，等你熟悉Django以后再尝试将其改为True。如果你的表存在外键，你需要手动设置models.ForeignKey的on_delete属性，例如models.ForeignKey(on_delete=models.CASCADE) ，表示这是一个级联删除的外键。然后你可以参考前面的教程，将模型注册到Django Admin中，实现数据管理的功能。本教程的项目代码{anote icon="fa-download" href="https://www.liuyh.com/download/file?cid=311" type="info" content="LemisManage.zip"/}