有一次django开发实录

文章目录

  • 数据库中的数据表生成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')

✅ 总结

  1. 配置好 SQL Server 数据库。
  2. 使用 python manage.py inspectdb 自动生成 models.py
  3. 检查字段类型和 Meta 配置。
  4. 可以直接在 Django ORM 中操作已有表的数据。

如果你希望,我可以帮你生成一个 针对你提供的 BusinessService 表的完整 Django Model,并且优化字段类型和注释,让你直接在项目中用。

你希望我直接帮你生成吗?

在使用inspectdb从数据库转移到模型文件中,出现报错

错误:

复制代码
SyntaxError: source code string cannot contain null bytes

意思是 你的 Python 源码文件中包含了非法的空字节 (\x00),Python 无法解析它。常见原因和解决方法如下:


1️⃣ 常见原因

  1. 文件编码/格式问题

    • 可能是文件在 Windows 上编辑时出现了 BOM 或其他不可见字符。
    • 或者文件被二进制内容覆盖(比如复制粘贴了非文本内容)。
  2. 下载或生成的文件损坏

    • 有些 inspectdbmodels.py 文件在生成时可能意外引入了空字节。
  3. 粘贴时引入不可见字符

    • 在 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


✅ 特点

  1. 只读接口ReadOnlyModelViewSet
  2. 分页 + 排序 + 字符搜索
  3. 可直接返回 JSON 数据
  4. 不包含新增、修改、删除操作

我可以帮你改造成 更接近生产环境的模板 ,比如支持 多个筛选字段时间区间筛选,返回的字段可自定义,避免返回敏感数据。

相关推荐
歪歪1005 小时前
介绍一下SQLite的基本语法和常用命令
数据库·sql·架构·sqlite
重回19815 小时前
Python 操作 SQLite:Peewee ORM 与传统 sqlite3.connect 的全方位对比
数据库·oracle·sqlite
lph0095 小时前
Android compose Room Sqlite 应用 (注入式)
android·数据库·sqlite
大可门耳5 小时前
Qt读写SQLite示例
jvm·qt·sqlite
安当加密5 小时前
DBG数据库透明加密网关:SQLServer应用免改造的安全防护方案,不限制开发语言的加密网关
网络·数据库
Q_Q5110082856 小时前
python+springboot+vue的旅游门票信息系统web
前端·spring boot·python·django·flask·node.js·php
Q_Q5110082856 小时前
python+django/flask的宠物救助及领养系统javaweb
vue.js·spring boot·python·django·flask·node.js
工业互联网专业6 小时前
南京某高校校园外卖点餐系统_django
vue.js·python·django·毕业设计·源码·课程设计·校园外卖点餐系统
承悦赋6 小时前
初识Redis:解锁高性能缓存的魔法钥匙
数据库·spring boot·redis·分布式·缓存·中间件