django 2.1 数据库操作
Django数据库操作
0.1 、js与python的json的操作
JSON.parse(data) JSON 字符串转换为 JavaScript 对象
JSON.stringify() JavaScript 值转换为 JSON 字符串
json.dumps(data) Python 对象编码成 JSON 字符串
json.loads(data) 已编码的 JSON 字符串解码为 Python 对象
查询数据:
1,查询数据库得到值
def find(request): qs = userInfo.objects.all().values() return HttpResponse(ls)
这个qs的是queryset,可以用 list( querySet ) 转换为列表
ls =list(userInfo.objects.all().values())
注:有些用userInfo.objects.values() 也把所有数据取出来了,为什么目前偶还不知道
1.1 、通过传来的参数从数据库中按条件查找
获取GET请求中携带的值 : request.GET.get('参数名' , None) #None为没找到值时返回的 后面有介绍获取其他请求方式的参数
def findDataTest(request): need_data = None alldata = user_lists.objects.values() #user_lists是model中的类名名 recive = request.GET.get("user_name",None) #获取传来的值, if recive: need_data = alldata.filter(user_name = recive) #添加过滤条件 need_data = json.dumps(list(need_data)) #转换为列表后再转换为json,另一种直接用 return JsonResponse({xxx:xxxx}) return HttpResponse(need_data)
其中,前端的请求url为:http://127.0.0.1:8000/user/findDataTest?user_name=nico
其向数据库查找的语句类似于:
SELECT * FROM table_name WHERE user_name = 'xxxx'
### QuerySet API:https://docs.djangoproject.com/en/3.1/ref/models/querysets/#filter
向前端返回json的另一种方式,使用django.http中的JsonResponse:
from django.http import HttpResponse,JsonResponse
xxxxxxxx
return JsonResponse( )
注:要返回除字典外的其他数据类型时,需要加safe=False,否者会抛出
'In order to allow non-dict objects to be serialized set the '
TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False
return JsonResponse(b,safe=False)
另一种是:return JsonResponse({“data” : d})
1.2、使用get根据id从数据库中查找数据
name = "emini"
try:
val = user_lists.objects.get(user_name=name)
except user_lists.DoseNotExist:
return JsonResponse("0")
..........
#name可以是前端传来的值,user_name是数据库中的字段名,返回一个不知道啥玩意,有点像字典,又不是字典的玩意,可以用 val.字段名 的方式来获取值,返回的这个里面有查询得到的那条数据(查到的话)
1.3、查询指定列的所有数据
newslist.objects.values("id","title","newstype")
2,增加数据( 增加到数据库中)
2.1、第一种插入值的方式
user_lists.objects.create(name=xxx, phone=xxx, address=xxx) #其中的name等为数据库表中的字段名,user_lists为创建表的时候写的那个类名,从models里导入即可
#这个方式添加数据则主键不能重复,重复会报错
#UNIQUE constraint failed
#可利用这个报错来判断是否增加成功
#有返回值
2.1.1、小栗子,利用objects.get()查找数据是否找到来判断非主键是否有重复的值
def add_user(request): name = "i_love" try: user_lists.objects.get(user_name = name) print("值已存在") return HttpResponse("add fail") except: user_lists.objects.create(user_name = name,user_phone_number = "759994",user_password = "ffJYJN") print("添加成功") return HttpResponse("add success")
2.2、第二种插入值的方式
#增加数据 ***该方式若通过id(主键)指定已有的数据则会直接覆盖原数据*** def add_user(request): try: u_ls = user_lists(user_name = "candi",user_phone_number = "759994",user_password = "ffJGify8YFJIJN") u_ls.save() return HttpResponse("add success") except: return HttpResponse("add err")
3、 更新数据,先从前端传来的数据中足以取值出来看数据库中的哪些字段在里面,即是要改的数据
def update_user(request): data = json.loads(request.body) #put请求。解码 willChangeData = data["data"] #根据传过来的数据形式取要更新的数据值 findedUserMsg = user_lists.objects.get(id = data.get("id")) #从数据库中查值 if "user_name" in willChangeData: #判断传来的数据里面要更新的是哪些数据,这里只写了一个 findedUserMsg.user_name = willChangeData["user_name"] findedUserMsg.save() #保存更新数据,否则数据库内不会有变化
前端发送请求的代码
let a = {id:4,data:{user_name:"mm",age:"18",phone:"123456789"}}
let sendData = JSON.stringify(a)
function updatafun(){
axios({
method:"put",
url:"http://127.0.0.1:8000/user/update_user/",
data:sendData
}).then(res=>{console.log(res)}).catch(err=>{console.log(err)})
}
思路:先通过objects.get()方法查找出该条记录,然后通过返回值来改他对应的值,再使用 xxx.save() 完成更新(xxx为查数据库返回的对象)
提示:d = {”aa“:"cb"} ”aa“ in d 会返回true,可以用这种方式判断某个值有没有在该字典的键中
4、删除数据
def deletedata(request): targetID = json.loads(request.body)["id"] #获取传来的id,与更新数据获取参数类似 try: data = user_lists.objects.get(id=targetID) #查找该条数据,查不到则抛出异常 except user_lists.DoesNotExist: return {'ret':0} data.delete() #调用删除方法 return JsonResponse({'ret':0})
2、从request中获取前端传来的数据
2.1 、获取post,put,delete请求传来的参数
def update_user(request): data = json.loads(request.body) #解码 #使用data["id"]或 data.get("id")调用即可
前端axios请求的代码
let a = {id:4,data:{user_name:"mm",age:"18",phone:"123456789"}}
let sendData = JSON.stringify(a)
axios({
method:"post",
url:"http://127.0.0.1:8000/user/update_user/",
data:sendData
}).then(res=>{console.log(res)}).catch(err=>{console.log(err)})
2.2 、获取get请求传来的参数,参数是与url拼接
def updata(request): ph = request.GET.get('id',None) #请求形式 :url: "http://xxx.xxx.xxx.xxx:8080/updata?id=12& ..."
前端axios请求的代码
axios({ method:"get", url:"http://127.0.0.1:8000/user/update_user", params:{id:11} }).then(res=>{console.log(res)}).catch(err=>{console.log(err)})
********博客是在学习过程中写的,可能有纰漏或不正确的地方*******
浙公网安备 33010602011771号