需求背景:
同时对Reviewers和Watchers中的名字进行批量的删除和替换,如果同一个名字在Reviewers或者Watchers里面只有一个,那么只能替换不能删除

需求分析:
名字在数据库中是一个字符串,字符串中包含多个名字,名字以逗号分开,使用传统的orm操作数据库有尝试但未实现,因为对取出来的字符串进行分隔,判断处理后进行save保存,会报Queryset没有save这个方法,因为数据量不大,最后以实现需求为目的,使用了最笨的方法(sql语句的replace和模糊匹配)

<div  style="padding-top:12px" align="center" ><label  >Current</label ><input type="text"  placeholder="请输入要替换/删除的人名..." id="current" ><label  >Modify</label ><input type="text"  placeholder="请输入被替换的人名..." id="modify"><button  type="button"  onclick="Confirm()"> 确定 </button></div>

效果展示

如果只输入了Current那么就是删除操作,既输入了Current又输入了Modidy那么就是替换(因为管理者可能仅对已经不在的人进行删除,那么就需要判断Reviewers和Watchers中每条记录是否包含要被删除的名字并且还要判断改名字有是否就一个,一个就不能删除需要提示操作者不能删除只能替换)

#判断前端输入的是一个值还是两个值,如果modify为空,说明是要删除操作,使用Q查询查出reviewers和watchers所有的包含
#要删除的名字,也就是看有没有要删除的名字在reviewers和watchers只有一个的current = request.POST.get("current", '')modify = request.POST.get("modify", '')db = MySQLdb.connect(host='127.0.0.1', port=3306, user='test', passwd='test_password', db='test_mysql',charset='utf8')# 使用cursor()方法获取操作游标cursor = db.cursor()if modify == '':id_list = []id_list_count = len(id_list)exit_person = Test_table.objects.filter(Q(reviewers=current) | Q(watchers=current))if exit_person:for i in exit_person:id_list.append(i.id)return JsonResponse({'msg': 'ID为' + str(id_list_count) + '的管理员只有一个,故只能替换不可删除!'})

如果要删除的名字在reviewers和watchers都不止一个,执行else,因为是数据是按逗号分隔的,而且也不知道要删除的名字的位置是在第一个还是中间或者末尾,所以使用sql进行模糊匹配,匹配成功的就replace(这里是删除的,用空字符串替换相当于删除了)

        else:try:# 最后一个用户sql1 = "update test_table set reviewers=replace(reviewers,',%s','') where reviewers like '%%,%s'" % (current, current)cursor.execute(sql1)# 首个用户sql2 = "update test_table set reviewers=replace(reviewers,'%s,','') where reviewers like '%s,%%'" % (current, current)cursor.execute(sql2)# 名字在中间的,在中间的匹配成功用逗号去替换,因为匹配的位置有两个逗号sql3 = "update test_table set reviewers=replace(reviewers,',%s,',',') where reviewers like '%%,%s,%%'" % (current, current)cursor.execute(sql3)sql4 = "update test_table set watchers=replace(watchers,',%s','')where watchers like '%%,%s';" % (current, current)cursor.execute(sql4)# 首个用户sql5 = "update test_table set watchers=replace(watchers,'%s,','') where watchers like '%s,%%'" % (current, current)cursor.execute(sql5)sql6 = "update test_table set watchers=replace(watchers,',%s,',',') where watchers like '%%,%s,%%'" % (current, current)cursor.execute(sql6)db .commit()except:db .rollback()# 关闭光标对象cursor.close()# 关闭数据库连接db .close()return JsonResponse({'msg':'删除成功!'})
#如果同时在Current和Modify中输入了名字,表明是要替换,跟上面的方法一样使用replace替换,
#但是需要注意的是,仅有一个名字的前后都没有逗号,需要多写一个sql语句去匹配并替换else:try:# 最后一个用户sql1 = "update test_table set reviewers=replace(reviewers,',%s',',%s')where reviewers like '%%,%s'" % (modify,current, modify)cursor.execute(sql1)# 字符串首个用户sql2 = "update test_table set reviewers=replace(reviewers,'%s,','%s,') where reviewers like '%s,%%'" % (modify,current, modify)cursor.execute(sql2)# 相同名字1 中间用户   lixuan1,lixuan1,wdwdsql3 = "update test_table set reviewers=replace(reviewers,',%s,',',%s,') where reviewers like '%%,%s,%%'" % (modify,current, modify)cursor.execute(sql3)sql3_1 = "update test_table set reviewers=replace(reviewers,'%s','%s') where reviewers like '%%%s%%'" % (modify, current, modify)cursor.execute(sql3_1)# 最后一个用户sql4 = "update test_table set watchers=replace(watchers,',%s',',%s')where watchers like '%%,%s'" % (modify,current, modify)cursor.execute(sql4)# 字符串首个用户sql5 = "update test_table set watchers=replace(watchers,'%s,','%s,') where watchers like '%s,%%'" % (modify,current, modify)cursor.execute(sql5)sql6 = "update test_table set watchers=replace(watchers,',%s,',',%s,') where watchers like '%%,%s,%%'" % (modify,current, modify)cursor.execute(sql6)sql6_1 = "update test_table set watchers=replace(watchers,'%s','%s') where watchers like '%%%s%%'" % (modify, current, modify)cursor.execute(sql6_1)db.commit()except:db.rollback()# 关闭光标对象cursor.close()# 关闭数据库连接db.close()

执行完上面操作后,会出现一个问题,如果要修改的人(受让人)本来在reviewers或watchers中就有,在替换的话是不是名字就重复了,所以最后再做一个去重的操作,保证reviewers和watchers中的名字不会重复

set_person = Test_table .objects.filter(Q(reviewers__icontains=current) | Q(watchers__icontains=current))for k in set_person:# 如果多个名字匹配成功的列表中会出现匹配成功的名字info = re.findall(r"%s" % current, k.reviewers)  info1 = re.findall(r"%s" % current, k.watchers)#这里判断数量if len(info) > 1:#删除重复的s = k.reviewers.replace(',%s' % current, "")#重新写入Test_table .objects.filter(id=k.id).update(reviewers=s)if len(info1) > 1:s1 = k.watchers.replace(',%s'% current, "")Test_table .objects.filter(id=k.id).update(watchers=s1)

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
完整代码

def modify(request):current = request.POST.get("current", '')modify = request.POST.get("modify", '')db = MySQLdb.connect(host='127.0.0.1', port=3306, user='test', passwd='test_password', db='test_mysql',charset='utf8')# 使用cursor()方法获取操作游标cursor = db.cursor()if modify == '':id_list = []id_list_count = len(id_list)exit_person = Test_table .objects.filter(Q(reviewers=current) | Q(watchers=current))if exit_person:for i in exit_person:id_list.append(i.id)return JsonResponse({'msg': 'ID为' + str(id_list_count) + '的管理员只有一个,故只能替换不可删除!'})else:try:# 最后一个用户sql1 = "update test_table set reviewers=replace(reviewers,',%s','') where reviewers like '%%,%s'" % (current, current)cursor.execute(sql1)# 首个用户sql2 = "update test_table set reviewers=replace(reviewers,'%s,','') where reviewers like '%s,%%'" % (current, current)cursor.execute(sql2)# 相同名字1 中间用户  sql3 = "update test_table set reviewers=replace(reviewers,',%s,',',') where reviewers like '%%,%s,%%'" % (current, current)cursor.execute(sql3)sql4 = "update test_table set watchers=replace(watchers,',%s','')where watchers like '%%,%s';" % (current, current)cursor.execute(sql4)# 首个用户sql5 = "update test_table set watchers=replace(watchers,'%s,','') where watchers like '%s,%%'" % (current, current)cursor.execute(sql5)# 相同名字1 中间用户   sql6 = "update test_table set watchers=replace(watchers,',%s,',',') where watchers like '%%,%s,%%'" % (current, current)cursor.execute(sql6)db .commit()except:db .rollback()# 关闭光标对象cursor.close()# 关闭数据库连接db .close()return JsonResponse({'msg':'删除成功!'})else:try:# 最后一个用户sql1 = "update test_table set reviewers=replace(reviewers,',%s',',%s')where reviewers like '%%,%s'" % (modify,current, modify)cursor.execute(sql1)# 字符串首个用户sql2 = "update test_table set reviewers=replace(reviewers,'%s,','%s,') where reviewers like '%s,%%'" % (modify,current, modify)cursor.execute(sql2)# 相同名字1 中间用户  sql3 = "update test_table set reviewers=replace(reviewers,',%s,',',%s,') where reviewers like '%%,%s,%%'" % (modify,current, modify)cursor.execute(sql3)sql3_1 = "update test_table set reviewers=replace(reviewers,'%s','%s') where reviewers like '%%%s%%'" % (modify, current, modify)cursor.execute(sql3_1)# 最后一个用户sql4 = "update test_table set watchers=replace(watchers,',%s',',%s')where watchers like '%%,%s'" % (modify,current, modify)cursor.execute(sql4)# 字符串首个用户sql5 = "update test_table set watchers=replace(watchers,'%s,','%s,') where watchers like '%s,%%'" % (modify,current, modify)cursor.execute(sql5)# 相同名字1 中间用户  sql6 = "update test_table set watchers=replace(watchers,',%s,',',%s,') where watchers like '%%,%s,%%'" % (modify,current, modify)cursor.execute(sql6)sql6_1 = "update test_table set watchers=replace(watchers,'%s','%s') where watchers like '%%%s%%'" % (modify, current, modify)cursor.execute(sql6_1)db.commit()except:db.rollback()# 关闭光标对象cursor.close()# 关闭数据库连接db.close()set_person = Test_table .objects.filter(Q(reviewers__icontains=current) | Q(watchers__icontains=current))for k in set_person:info = re.findall(r"%s" % current, k.reviewers)info1 = re.findall(r"%s" % current, k.watchers)if len(info) > 1:s = k.reviewers.replace(',%s' % current, "")Test_table .objects.filter(id=k.id).update(reviewers=s)if len(info1) > 1:s1 = k.watchers.replace(',%s'% current, "")Test_table .objects.filter(id=k.id).update(watchers=s1)

整体下来用了挺长时间的,可能比较麻烦,但是为了在规定时间内完成任务也没办法了,这里记录一下

Django 对指定数据进行批量替换和删除相关推荐

  1. 对大量文本进行指定内容的批量替换

    首先,我们面对的需求是将30个SQL脚本中的where条件进行修改,由原来的 "CRTABLE<>'ZT'"替换为"CRTABLE<>'ZT' a ...

  2. Word中的通配符随意组合进行批量替换或删除某些内容

    长文档需要批量修改或删除某些内容的时候,我们可以利用Word中的通配符来搞定这一切,当然,前提是你必须会使用它.通配符的功能非常强大,能够随意组合替换或删除我们定义的规则内容,下面易老师就分享一些关于 ...

  3. VBS 从Excel中获取数据,批量替换word中的文字

    简介 比如我有一个需求,需要把一份 word 中的英文国家名全部替换成中文国家名,excel中的第一列是英文国家名,第二列是中文国家名.人工完成的话,费时费力,使用我编写的程序,双击一下,瞬间完成. ...

  4. sed找到指定字符并进行替换或者删除

    正常替换的语法格式: echo "we are famify" | sed "/are/s/e/E/g" #wE arE famify 如果我们需要把are替换 ...

  5. 怎么将 Excel 中的第一个工作表或者其它指定的工作表批量替换成新的内容?

    概要:在我们日常办公中,经常会碰到需要替换 Excel 中的某一个 Sheet 或者某几个 Sheet 的功能,「我的ABC软件工具箱」就实现了批量替换指定 Sheet 的功能,可以轻松实现对 Exc ...

  6. 怎么将 Word、PPT、PDF 中的第一页、最后一页以及其它指定页批量替换成新的内容?

    概要:在我们日常办公中,经常会碰到需要替换文档中的某一页或者某几页的功能,「我的ABC软件工具箱」就实现了批量替换指定页的功能,可以轻松实现对 Word.PPT.PDF 文件的第一页.最后一页以及其他 ...

  7. mongoose 批量修改字段_WordPress图片路径批量替换方法

    不少数站长在使用WordPress博客或者搬家时,需要把WordPress文章中的图片路径进行替换来解决图片不显示的问题.总结一下WP图片路径批量替换的过程,方便有此类需求的站长们学习. 什么情况下批 ...

  8. WordPress图片路径批量替换方法

    不少数站长在使用WordPress博客或者搬家时,需要把WordPress文章中的图片路径进行替换来解决图片不显示的问题.总结一下WP图片路径批量替换的过程,方便有此类需求的站长们学习. 什么情况下批 ...

  9. Excel如何在整个工作簿中批量替换指定数据

    今天跟大家分享一下Excel如何在整个工作簿中批量替换 1.下面以下图为例跟大家介绍一下怎么批量替换整个工作簿数据. 2.首先我们点击下图选项 3.单击[更多].[批量替换] 4.选择全部工作表,然后 ...

  10. 利用MySQL语句批量替换指定wordpress文章中的图片路径

    天花了很多时间将SAE服务器中的图片下载到本地,然后删掉,但是有一个问题就是,所有文章中的图片路径还是以前的,没有根据域名来.导致下午某些时间段图片都是无法显示的,后来想到用MySQL直接批量替换,执 ...

最新文章

  1. 看完这些细分领域别说小程序代理创业没有机会
  2. 设计模式学习笔记——命令模式(Command)
  3. spring task 定时
  4. 女朋友生气了,日常生活中该具体怎么做才好,才好女朋友开心?
  5. sublime 无法下载插件解决办法(亲测有效)
  6. Python:序列化
  7. Java设计模式笔记--------工厂模式------抽象工厂模式
  8. imagej得到灰度图数据_Java图像处理最快技术:ImageJ 学习第一篇
  9. 照片怎么转PDF格式?这两个方法快来学习下
  10. SVN提交文件失败:系统找不到指定路径
  11. 实现远程连接阿里云的数据库
  12. 宝尚市场静候收官的市场又出现短期噪音
  13. oreo另一个意思_孑孓、仄亾、片爿…看起来天生一对的字,意思竟然大不同
  14. 6个步骤教你用Python解数独!(含实例代码)
  15. seqkit根据基因id_基因家族分析保姆级教程(分子进化)-生信小白自学之路
  16. 干货|如何写好项目进度报告
  17. uni-app项目起步
  18. 项目提测CheckList通用版
  19. OUC2021秋-Web安全技术-期末(回忆版)
  20. 第一章 第一节 可充当主语的词类

热门文章

  1. 分享11款Steam推理游戏
  2. 为什么python文件用cmd老是出现语法错误_关于Python的py文件在Python自带的shell编辑器中运行成功,用cmd打开运行却出错 在cmd下运行结果...
  3. linux系统新增2t以上硬盘,在linux下新增一块硬盘的操作。(包含大于2T的硬盘在linux下挂载操作)...
  4. python中backward是什么意思_python-PyTorch函数中的下划线后缀是什么意思...
  5. 孙式太极拳的站桩(作者:孙剑云)
  6. 2021-11-09水洗碳带有什么特点
  7. 0x0000004e蓝屏代码解决教程
  8. sdk 今日头条_今日头条商业SDK(激励视频)的坑
  9. 【MFC】多国语言工具栏
  10. python运算符用来计算集合并集的_Python 运算符中用来计算集合并集的是 _______ 。_学小易找答案...