Django 接收 POST 请求并高效保存至数据库的技巧

晚来风
晚来风
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍在 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 请求数据并保存至数据库的完整实现方法,希望能为各位开发者提供参考,欢迎继续支持本站内容。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表