You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django结合SQLite实现点击保存按钮动态创建数据库表问题咨询

现有代码问题原因与修复

问题原因

你当前代码中对data变量的赋值逻辑存在覆盖问题:

for i in interfaces: 
    data =[{"interface": i}]  

每次循环都会把data重新赋值为仅包含当前遍历接口的列表,循环结束后data只会保留最后一个接口TenGigabitEthernet1/1/26的内容,所以最终序列化返回的接口列表只有一条数据。

修复方案

直接用列表推导式生成符合序列化要求的格式即可,不需要循环赋值:

# 替换原来的for i in interfaces循环部分
data = [{"interface": item} for item in interfaces]
interserializer = InterfaceSerializers(data, many = True)
动态生成数据表需求实现

实现逻辑

你需要在主表记录保存成功后,执行原生SQL创建对应名称的新表,注意要加事务保证数据一致性,同时避免SQL注入风险。
示例代码(保存接口的视图示例):

from django.db import connection, transaction
from .models import YourMainModel # 替换为你存name的主表模型

@api_view(['POST'])
def save_record(request):
    name = request.data.get('name')
    with transaction.atomic():
        # 1. 保存主表记录,拿到生成的id
        main_record = YourMainModel.objects.create(name=name)
        record_id = main_record.id
        # 2. 组装表名,注意做合法校验,避免特殊字符
        table_name = f"example_{record_id}"
        # 3. 执行建表SQL,替换字段为你需要的专属字段
        with connection.cursor() as cursor:
            cursor.execute(f"""
                CREATE TABLE IF NOT EXISTS {table_name} (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    -- 下面替换为你需要的专属字段
                    field1 TEXT NOT NULL,
                    field2 INTEGER DEFAULT 0,
                    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
                )
            """)
    return Response({"status": "success", "record_id": record_id})

优化建议

动态建表不是Django的常规用法,维护成本较高,如果你的所有动态表的字段结构完全一致,更推荐用关联表方案替代:

  • 新增一张通用的业务表,加一个main_record_id外键关联主表的id
  • 不同id对应的记录靠外键字段区分,不需要单独建表,完全可以用Django ORM操作,不需要写原生SQL,出错概率更低。

内容的提问来源于stack exchange,提问作者L.Calvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:09:04