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
相关产品推荐
相关产品推荐

