Django 接收 POST 请求并高效保存至数据库的技巧
本文介绍在 Django 中处理 POST 请求并保存数据至数据库的高效技巧。通过遍历 request.POST 构建字典,过滤 CSRF 令牌后,利用 **dict 解包语法进行批量更新或创建,简化代码逻辑。同时强调保存后需重新获取对象以获取 get_type_display 等字段的转义显示值,确保数据展示准确。
Django 高效保存 POST 数据技巧
基础操作虽人人皆知,但掌握一些实用技巧往往能大幅节省开发时间。
本文将介绍如何利用字典特性简化数据保存过程,从而减少编码工作量。
核心思路是通过 for 循环提取 POST 表单中的字段值,将其存入字典,随后利用字典解包操作将数据保存至数据库。
首先,用户提交的表单中默认包含 CSRF 令牌。
服务端在处理时,需过滤掉 csrfmiddlewaretoken 字段,仅将其余有效数据保存至数据库。
具体实现逻辑见下方代码示例。
以下代码分别展示了数据修改与新增的逻辑,其中修改操作依据 ID 进行。
需要注意以下关键点:
第一,保存前的 resourcesOld 对象与保存后重新获取的 resourcesNew 对象存在差异。
特别是涉及 type 字段时,需调用 get_type_display() 方法获取转义后的显示值。若直接操作原始数据,无法获得该转义值,必须重新查询 resourcesNew 对象才能获取正确的显示内容。
第二,关于保存语句的写法。部分开发者习惯使用 T_Resources.objects.create(id=id, name=name, age=age...) 这种显式传参的方式,每次均需手动列出字段。
这种写法较为繁琐,因此下文采用了更简洁的字典解包写法,两者执行结果一致。此外还有 save 方法的变体,此处不再赘述。
代码实现与注意事项
def resources(request):
if request.method == 'GET':
return render(request, 'docker/Resources.html', )
else:
systemDict = {}
for key in request.POST:
if key != 'csrfmiddlewaretoken':
systemDict[key] = request_postData.get(key)
if 'id' in request_postData:
result = {'code': 401, 'message': '修改失败!', 'data': None}
try:
resourcesOld=T_Resources.objects.get(id=systemDict['id'])
T_Resources.objects.filter(id=systemDict['id']).update(**systemDict)
resourcesNew=T_Resources.objects.get(id=systemDict['id'])
result['code'] = 201
result['message'] = '修改成功'
logInfo = "服务器IP:" + resourcesOld.ip + ","
if resourcesOld.name != resourcesNew.name:
logInfo += "名称:" + resourcesOld.name + "->" + resourcesNew.name + ','
if resourcesOld.type != resourcesNew.type:
logInfo += "类型:" + resourcesOld.get_type_display() + "->" + resourcesNew.get_type_display() + ','
if resourcesOld.label != resourcesNew.label:
oldLabel = list(T_Label.objects.filter(type='T_Resources', value__in=resourcesOld.label).values_list('name', flat=True))[0]
newLabel = list(T_Label.objects.filter(type='T_Resources', value__in=resourcesNew.label).values_list('name', flat=True))[0]
logInfo += "标签:" + oldLabel + "->" + newLabel + ','
writeOperationLog(request, 1, '修改服务器成功,' + logInfo)
except:
pass
return HttpResponse(json.dumps(result, ensure_ascii=False))
else:
result = {'code': 401, 'message': '添加失败!', 'data': None}
try:
id=T_Resources.objects.create(**systemDict).id
resources=T_Resources.objects.get(id=id)
result['code'] = 201
result['message'] = '添加成功'
except:
pass
return HttpResponse(json.dumps(result, ensure_ascii=False))
以上即为 Django 接收 POST 请求数据并保存至数据库的完整实现方法,希望能为各位开发者提供参考,欢迎继续支持本站内容。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









