文章目录
- 数据库中的数据表生成models.py中生成class
-
- [1️⃣ 确保数据库配置正确](#1️⃣ 确保数据库配置正确)
- [2️⃣ 使用 `inspectdb` 生成模型](#2️⃣ 使用
inspectdb
生成模型) - [3️⃣ 检查生成的 `models.py`](#3️⃣ 检查生成的
models.py
) - [4️⃣ 使用生成的模型](#4️⃣ 使用生成的模型)
-
- [✅ 总结](#✅ 总结)
- 在使用inspectdb从数据库转移到模型文件中,出现报错
-
- [1️⃣ 常见原因](#1️⃣ 常见原因)
- [2️⃣ 解决方法](#2️⃣ 解决方法)
- 使用接口返回数据
-
- [1️⃣ 安装 DRF](#1️⃣ 安装 DRF)
- [2️⃣ 创建序列化器](#2️⃣ 创建序列化器)
- [3️⃣ 创建只读视图(ViewSet)](#3️⃣ 创建只读视图(ViewSet))
- [4️⃣ 配置 URL](#4️⃣ 配置 URL)
- [5️⃣ 使用接口](#5️⃣ 使用接口)
数据库中的数据表生成models.py中生成class
SQLserver 已经具有表的情况下,直接生成models对象。
1️⃣ 确保数据库配置正确
在 settings.py
中配置好 SQL Server 数据库:
python
DATABASES = {
'default': {
'ENGINE': 'mssql',
'NAME': 'your_db_name',
'USER': 'your_user',
'PASSWORD': 'your_password',
'HOST': 'localhost', # 或 SQL Server 地址
'PORT': '1433',
'OPTIONS': {
'driver': 'ODBC Driver 18 for SQL Server',
},
}
}
2️⃣ 使用 inspectdb
生成模型
进入你的 Django 项目目录,然后执行:
bash
# 自动生成 models.py 文件
python manage.py inspectdb > app_name/models.py
inspectdb
会扫描数据库中所有表,并根据字段类型生成对应的 Django Model。- 如果只想生成特定表,可以指定表名:
bash
python manage.py inspectdb BusinessService > business/models.py
3️⃣ 检查生成的 models.py
生成的代码一般类似:
python
class BusinessService(models.Model):
FBILLNO = models.CharField(max_length=100)
FDATE = models.DateTimeField()
FSUPPLIERID = models.IntegerField()
FSTATUS = models.CharField(max_length=1)
class Meta:
managed = False # 默认 False,表示 Django 不管理表的迁移
db_table = 'BusinessService'
managed = False
表示 Django 不会尝试创建或修改该表,只用于 ORM 映射。- 如果以后想让 Django 管理表,可以改为
managed = True
并执行迁移。
4️⃣ 使用生成的模型
python
from business.models import BusinessService
# 查询数据
services = BusinessService.objects.all()
# 条件查询
service = BusinessService.objects.filter(FSTATUS='1')
✅ 总结
- 配置好 SQL Server 数据库。
- 使用
python manage.py inspectdb
自动生成models.py
。 - 检查字段类型和
Meta
配置。 - 可以直接在 Django ORM 中操作已有表的数据。
如果你希望,我可以帮你生成一个 针对你提供的 BusinessService 表的完整 Django Model,并且优化字段类型和注释,让你直接在项目中用。
你希望我直接帮你生成吗?
在使用inspectdb从数据库转移到模型文件中,出现报错
错误:
SyntaxError: source code string cannot contain null bytes
意思是 你的 Python 源码文件中包含了非法的空字节 (\x00
),Python 无法解析它。常见原因和解决方法如下:
1️⃣ 常见原因
-
文件编码/格式问题
- 可能是文件在 Windows 上编辑时出现了 BOM 或其他不可见字符。
- 或者文件被二进制内容覆盖(比如复制粘贴了非文本内容)。
-
下载或生成的文件损坏
- 有些
inspectdb
或models.py
文件在生成时可能意外引入了空字节。
- 有些
-
粘贴时引入不可见字符
- 在 IDE 或网页复制粘贴代码时可能会带入空字节。
2️⃣ 解决方法
重新保存文件
- 使用 纯文本编辑器(VSCode、Sublime Text、Notepad++)打开文件。
- 选择 UTF-8 无 BOM 编码重新保存。
- 确保文件里没有不可见字符。
--python 是 UTF8 -- 格式的。
使用接口返回数据
需要支持:
- 分页
- 基于时间字段排序
- 基于字符字段筛选
- 返回数据表的数据
- 没有新增、编辑功能
1️⃣ 安装 DRF
bash
pip install djangorestframework
在 settings.py
中注册:
python
INSTALLED_APPS = [
# ... 原有 app
'rest_framework',
]
2️⃣ 创建序列化器
python
# business/serializers.py
from rest_framework import serializers
from .models import BusinessService
class BusinessServiceSerializer(serializers.ModelSerializer):
class Meta:
model = BusinessService
fields = '__all__'
3️⃣ 创建只读视图(ViewSet)
python
# business/views.py
from rest_framework import viewsets, filters
from .models import BusinessService
from .serializers import BusinessServiceSerializer
from rest_framework.pagination import PageNumberPagination
# 自定义分页
class StandardResultsSetPagination(PageNumberPagination):
page_size = 10 # 默认每页 10 条
page_size_query_param = 'page_size'
max_page_size = 100
class BusinessServiceViewSet(viewsets.ReadOnlyModelViewSet):
"""
只读接口:支持分页、排序、筛选
"""
queryset = BusinessService.objects.all()
serializer_class = BusinessServiceSerializer
pagination_class = StandardResultsSetPagination
filter_backends = [filters.OrderingFilter, filters.SearchFilter]
# 支持按时间字段排序,例如 FDATE
ordering_fields = ['FDATE', 'FCREATEDATE', 'FMODIFYDATE']
ordering = ['-FDATE'] # 默认降序
# 支持基于字符字段搜索,例如 FBILLNO, FBUSINESSTYPE
search_fields = ['FBILLNO', 'FBUSINESSTYPE', 'FSOURCEBILLNO']
4️⃣ 配置 URL
python
# business/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import BusinessServiceViewSet
router = DefaultRouter()
router.register(r'business', BusinessServiceViewSet, basename='business')
urlpatterns = [
path('', include(router.urls)),
]
然后在主路由 urls.py
中引入:
python
path('api/', include('business.urls')),
5️⃣ 使用接口
-
获取第一页数据(每页 10 条):
GET /api/business/
-
分页参数:
GET /api/business/?page=2&page_size=20
-
排序(例如按创建时间升序):
GET /api/business/?ordering=FCREATEDATE
-
排序降序:
GET /api/business/?ordering=-FCREATEDATE
-
基于字符字段搜索:
GET /api/business/?search=BS123 # 会匹配 FBILLNO、FBUSINESSTYPE、FSOURCEBILLNO
✅ 特点
- 只读接口 (
ReadOnlyModelViewSet
) - 分页 + 排序 + 字符搜索
- 可直接返回 JSON 数据
- 不包含新增、修改、删除操作
我可以帮你改造成 更接近生产环境的模板 ,比如支持 多个筛选字段 、时间区间筛选,返回的字段可自定义,避免返回敏感数据。