有一次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. 不包含新增、修改、删除操作

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

相关推荐
架构师老Y42 分钟前
003、Python Web框架深度对比:Django vs Flask vs FastAPI
前端·python·django
小陈工4 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花8 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸8 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain8 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希9 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神9 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员9 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java9 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿9 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb