Django--CRM--QueryDict, 模糊搜索, 加行级锁
一 . QueryDict的修改
# QueryDict正常是不允许修改的,要想往里面添加内容,需要另mutable=True
dic = request.GET
print(dic) # <QueryDict: { 'query' : ['12']}>
dic._mutable=True # 这种的需要加上下划线
dic['key'] = value # 这样才可以添加 # 还可以直接实例化,当参数传过去的时候
from django.http.request import QueryDict
class Base:
def __init__(self, params=None)
self.params = QueryDict(mutable=True) # 这种也是让它可以修改 还可以实参是request.GET.copy() # 这是深copy并且可修改 # 当我们需要拿到QueryDict中的数据的时候可以直接dic.urlencode()
print(dic.urlencode()) #query=12
二 . 路径跳转拼接
比如说我们在淘宝首页在没有登录的情况下点击'我的订单',他会让你先去登录,登陆完直接就跳转到'我的订单' ,这里其实就用到了路径拼接的功能
我们要想做路径拼接跳转需要借助于自定义过滤器来做
from django import template
from django.urls import reverse
from django.http.request import QueryDict
register = template.Library() # 用这个的原因是可以传多个参数
@register.simple_tag
def reverse_url(request, url_name, *args, **kwargs ):
next = request.get_full_path() # 拿到的是带参数的路径
qd = QueryDict(mutable=True)
qd['next'] = next
base_url = reverse(url_name, args=args, kwargs=kwargs)
# next=/crm/customer_list/?query=in&page=2 如果不urlencode 这个&之后的东西会被分割这样就会丢参数
# urlencode之后 next=%2Fcrm%2Fcustomer_list%2F%3Fquery%3Din%26page%3D2
# 虽然转换了,但是你去get的时候自己还会变回来的
return '%s?%s' % (base_url, qd.urlencode())
下面来看看怎么用

三 . 模糊搜索
1 . 模糊搜索肯定是要用到上面的request.GET.copy()的,因为我们如果不用会出现条件缺失的情况, 见下图


2. 我们在进行模糊搜索的时候需要用到Q查询

四 . POST方式提交数据
视图函数
def course_record_change(request, class_id=None, course_record_id=None):
# 做choices限制条件可以直接models.类(限制条件),这个不跟数据库打交道 要想从数据库拿数据必须要ORM操作(编辑)
obj = models.CourseRecord(re_class_id=class_id, teacher=request.user_obj) if class_id else models.CourseRecord.objects.filter(
pk=course_record_id).first()
form_obj = CourseRecordForm(instance=obj) # 有instance=obj 显示原始数据(编辑) if request.method == 'POST':
form_obj = CourseRecordForm(request.POST, instance=obj)
if form_obj.is_valid():
form_obj.save()
return redirect(reverse('course_record_list', args=class_id)) title = '新增课程记录' if class_id else '编辑课程记录'
return render(request, 'form.html', {'form_obj': form_obj, 'title': title})
如果一个字段中有很多的数据,但是根据实际情况我们只需要展示一个,就要进行限制操作



五 . 行级锁
当数据是共享的时候,我们就要注意一下数据可能在修改的过程中出现问题,公户变私户过程中,两个销售都想把剩下的公户变成私户,但是按理说其中一个把公户变成私户后,另一个人就不能操作了, 想达到这种效果,我们就需要加上行级锁
行级锁的作用就是当你对一个数据进行操作的时候,其他人只能查看这个数据, 不能操作, 只有你把锁放了,其他人才能进行增删改等操作.
# 数据库中的行级锁:
begin; # 开启事务
select * from 表名 where 条件 for update; # 加锁
commit; #提交事务 这个操作完成后别人才能对这条数据进行操作 # ORM中加行级锁
from django.db import transaction with transaction.atomic(): # 事务
# 方式一 查询的客户
queryset = models.Customer.objects.filter(pk__in=ids, consultant__isnull=True).select_for_update() # 加行级锁
# 根据需要在这里加上判断
queryset.update(consultant=self.request.user_obj)
六 . 返回数据的方法
像我们在视图函数中进行操作之后都会return render() 或者return redirect() 或者 return HttpResponse(),
但是有的时候我们想要更准确的返回结果,比如公户变私户后,提交数据之后返回公户页面,私户边公户后,然后返回私户,
但是由于公户和私户这个select框都是在customer_list这个页面里,
如果只是redirect(customer),那么无论是公变私,还是私变公,最后返回的都是select框里面的第一个数据的页面.要想解决这个现象, 我们可以进行以下操作.

Django--CRM--QueryDict, 模糊搜索, 加行级锁的更多相关文章
- MySQL 是怎么加行级锁的?为什么一会是 next-key 锁,一会是间隙锁,一会又是记录锁?
大家好,我是小林. 是不是很多人都对 MySQL 加行级锁的规则搞的迷迷糊糊,一会是 next-key 锁,一会是间隙锁,一会又是记录锁. 坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如 ...
- MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?
大家好,我是小林. 最近重新补充了<MySQL 有哪些锁>文章内容: 增加记录锁.间隙锁.net-key 锁 增加插入意向锁 增加自增锁为 innodb_autoinc_lock_mode ...
- Mysql的事务及行级锁
转自:http://www.cnblogs.com/edwinchen/p/4171866.html 以签到为例,每个用户每天只能签到一次,那么怎么去判断某个用户当天是否签到呢?因为当初表设计的时候, ...
- mysql 行级锁的使用以及死锁的预防
一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...
- 关于mysql数据库行级锁的使用(一)
项目上一个业务需要对某条数据库记录加锁,使用的是mysql数据库 因此做了一个关于mysql数据库行级锁的例子做测试 package com.robert.RedisTest; import java ...
- MYSQL 表级锁 行级锁 页面锁区别
myisam存储引擎默认是表级锁 innodb存储引擎默认是行级锁 DBD存储引擎默认是页面锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发出锁冲突的概率最高,并发度最低.行级锁:开锁大, ...
- sql server行级锁,排它锁,共享锁的使用
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ...
- PLSQL_Oracle Table Lock表级锁的处理(案例)
20150506 Created By BaoXinjian
随机推荐
- 《JAVA程序设计》_第一周学习总结
20175217吴一凡 <java程序设计> 第一周学习总结 虽然已经做好了心理准备,但第一周的学习任务着实让我忙了整整三天,还是挺充实的吧.寒假已经在自己的电脑上安装好了虚拟机,我就在我 ...
- ASP.NET API Helper Page 创建并生成相关帮助文档
创建API项目 修改原工程文件,该行为是为了避免和引入第三方API工程文件冲突 修改发布设置 引入需要生成文档的相关文件,将第三方API依赖的相关文件(XML文件非常重要,是注释显示的关键),复制到文 ...
- 发现一款比echarts更牛B,效果更炫的图表组件 d3.js
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code d3.js ,能制作更加复杂的图表 https://github.com/d3/d3 ...
- github上传超过100mb文件怎么办
使用Git LFS 上传.Git lFS(Git Large File Storage) 可以上传超过100MB的文件,使用方式为: 下载安装Git LFS 打开git cmd 中间输入 账号和密码 ...
- 14 python初学(高阶函数 递归函数 内置函数)
高阶函数:1. 函数名是一个变量,函数名可以进行赋值 2. 函数名可以作为函数参数,还可以作为函数返回值(函数名称作为函数返回值时返回的是:函数的地址:print 这个返回值的调用相当于执行这个函数 ...
- linux命令之netstat
功能:打印网络连接.路由表.接口统计信息.伪装连接和多播成员 参数 -r 显示路由表 -i 显示接口表 -n 不解析名字 -p 显示程序名 PID/Program -l 显示监听的 socket -a ...
- Git Submodule管理项目子模块
使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...
- Linux内存管理 一个进程究竟占用多少空间?-VSS/RSS/PSS/USS
关键词:VSS.RSS.PSS.USS._mapcount.pte_present.mem_size_stats. 在Linux里面,一个进程占用的内存有不同种说法,可以是VSS/RSS/PSS/US ...
- 使用python进行utf9编码和解码
在2005年4月1日(也就是愚人节),IEEE的rfc4042文件规定了utf9和utf18这2个所谓的Unicode的高效转换格式. 具体的格式说明,有兴趣的话点击上面的rfc4042链接去观看. ...
- Java执行JavaScript脚本破解encodeInp()加密
一:背景 在模拟登录某网站时遇到了用户名和密码被JS进行加密提交的问题,如图: 二:解决方法 1.我们首先需要获得该JS加密函数,一般如下: conwork.js var keyStr = " ...