有一次django开发实录
文章目录
- 数据库中的数据表生成models.py中生成class
- 1️⃣ 确保数据库配置正确
- 2️⃣ 使用 `inspectdb` 生成模型
- 3️⃣ 检查生成的 `models.py`
- 4️⃣ 使用生成的模型
- ✅ 总结
- 在使用inspectdb从数据库转移到模型文件中,出现报错
- 1️⃣ 常见原因
- 2️⃣ 解决方法
- 重新保存文件
- 使用接口返回数据
- 1️⃣ 安装 DRF
- 2️⃣ 创建序列化器
- 3️⃣ 创建只读视图(ViewSet)
- 4️⃣ 配置 URL
- 5️⃣ 使用接口
数据库中的数据表生成models.py中生成class
SQLserver 已经具有表的情况下,直接生成models对象。
1️⃣ 确保数据库配置正确
在 settings.py
中配置好 SQL Server 数据库:
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 项目目录,然后执行:
# 自动生成 models.py 文件
python manage.py inspectdb > app_name/models.py
inspectdb
会扫描数据库中所有表,并根据字段类型生成对应的 Django Model。- 如果只想生成特定表,可以指定表名:
python manage.py inspectdb BusinessService > business/models.py
3️⃣ 检查生成的 models.py
生成的代码一般类似:
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️⃣ 使用生成的模型
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
pip install djangorestframework
在 settings.py
中注册:
INSTALLED_APPS = [# ... 原有 app'rest_framework',
]
2️⃣ 创建序列化器
# business/serializers.py
from rest_framework import serializers
from .models import BusinessServiceclass BusinessServiceSerializer(serializers.ModelSerializer):class Meta:model = BusinessServicefields = '__all__'
3️⃣ 创建只读视图(ViewSet)
# 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 = 100class BusinessServiceViewSet(viewsets.ReadOnlyModelViewSet):"""只读接口:支持分页、排序、筛选"""queryset = BusinessService.objects.all()serializer_class = BusinessServiceSerializerpagination_class = StandardResultsSetPaginationfilter_backends = [filters.OrderingFilter, filters.SearchFilter]# 支持按时间字段排序,例如 FDATEordering_fields = ['FDATE', 'FCREATEDATE', 'FMODIFYDATE']ordering = ['-FDATE'] # 默认降序# 支持基于字符字段搜索,例如 FBILLNO, FBUSINESSTYPEsearch_fields = ['FBILLNO', 'FBUSINESSTYPE', 'FSOURCEBILLNO']
4️⃣ 配置 URL
# business/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import BusinessServiceViewSetrouter = DefaultRouter()
router.register(r'business', BusinessServiceViewSet, basename='business')urlpatterns = [path('', include(router.urls)),
]
然后在主路由 urls.py
中引入:
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 数据
- 不包含新增、修改、删除操作
我可以帮你改造成 更接近生产环境的模板,比如支持 多个筛选字段、时间区间筛选,返回的字段可自定义,避免返回敏感数据。