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)})

 

 

 

 

 

********博客是在学习过程中写的,可能有纰漏或不正确的地方*******

posted on 2020-11-15 23:11  margoMirror  阅读(166)  评论(0)    收藏  举报