Django关于ORM的增删改查

Django中使用orm进行数据库的管理,主要包括以下步骤

1、创建model,

2、进行迁移

3、在视图函数中使用

以下的内容可以先从查询开始看,这样更容易理解后面删除部分代码

主要包括几下几种:

1、增

1)实例例化model,代码如下:

def submit(request):
    if request.method == 'GET':
        html = open("submit.html", encoding="utf-8").read()
        return HttpResponse(html)
    elif request.method == 'POST':
        # 获取提交的表单数据
        data = json.loads(request.body)
        print("请求数据",data)
        obj = Feedback()
        obj.quality = data.get('quality', 0)
        obj.attitude = data.get('attitude', 0)
        obj.speed = data.get('speed', 0)
        obj.text = data.get('text', '')
        obj.anonymous = data.get('anonymous', False)
        obj.save()
        request.session['feedback_data'] = data
        return JsonResponse({'status': 'success'})

但是这种方式有个弊端,就是需要写好几行,那么其实是有更简单的方式,就是调用类方法

2)调用类方法,代码如:

def submit(request):
    if request.method == 'GET':
        html = open("submit.html", encoding="utf-8").read()
        return HttpResponse(html)
    elif request.method == 'POST':
        # 获取提交的表单数据
        data = json.loads(request.body)
        print("请求数据",data)

        Feedback.objects.create(**data)
        return JsonResponse({'status': 'success'})

这种方法其实就是实例化之后,然后调用save方法,只不过是把这两个步骤进行封装

2、删,这里也是包括两种方法

1)第一种方法是实例化模型,直接调用delete方法,代码:

 obj_list: list[Feedback] = Feedback.objects.filter(id=2).filter(anonymous=True)  # 获取id等于2,并且是匿名的数据
        for obj in obj_list:
            obj.delete() #删除数据
            print(f"obj={obj}")

2)调用类方法,代码如:

def submit(request):
    if request.method == 'GET':
        html = open("submit.html", encoding="utf-8").read()
        return HttpResponse(html)
    elif request.method == 'POST':
        # 获取提交的表单数据
        data = json.loads(request.body)
        print("请求数据",data)
        obj:Feedback = Feedback.objects.filter(id=4).delete()
        obj_list: list[Feedback] = Feedback.objects.filter(id=2).filter(anonymous=True)  # 获取id等于2,并且是匿名的数据
        for obj in obj_list:
            obj.delete() #删除数据
            print(f"obj={obj}")

        return JsonResponse({'status': 'success'})

3、改,一共有两种方式:

1)修改实例对象

把id等于3的text字段值更改为:你好,代码如下:

 obj:Feedback = Feedback.objects.get(id=3) #获取id等于3的数据
        print("obj",obj.text)
        #把id等于3的text字段值更改为:你好
        obj.text = "你好"
        # 修改之后一定要重新保存
        obj.save()

2)调用类方法:

4、查,比如获取id等于3的text字段内容,

obj:Feedback = Feedback.objects.get(id=3) #获取id等于3的数据
        print("obj",obj.text)

查询是获取model实例对象的过程

1)获取单个对象:

obj:Feedback = Feedback.objects.get(id=3) #获取id等于3的数据

还有一种方式可以通过过滤,比如获取id等于3,代码如:

        obj_list: list[Feedback] = Feedback.objects.filter(id=3)  # 获取id等于3

2)获取全部的数据:

 obj_list: list[Feedback] = Feedback.objects.all()  # 获取全部数据
        for obj in obj_list:
            print(f"obj={obj}")

3)获取指定的数据,比如获取前100条数据:

        obj_list: list[Feedback] = Feedback.objects.all()[:100]  # 获取前100条数据

4)条件查询:

等于:=

 obj_list: list[Feedback] = Feedback.objects.filter(id=2) # 获取id等于2的数据

大于:__gt

obj_list: list[Feedback] = Feedback.objects.filter(id__gt=2)  # 获取前id大于2的数据

大于等于:__gte

 obj_list: list[Feedback] = Feedback.objects.filter(id__gte=2)  # 获取前id大于等于2的数据

小于:__lt

        obj_list: list[Feedback] = Feedback.objects.filter(id__lt=2)  # 获取前id小于2的数据

小于等于:__lte

        obj_list: list[Feedback] = Feedback.objects.filter(id__lte=2)  # 获取前id小于等于2的数据

包含:__in

 obj_list: list[Feedback] = Feedback.objects.filter(id__in=2)  # 获取前id包含2的数据

不包含:exclude

     obj_list: list[Feedback] = Feedback.objects.all().exclude(id=2)  # 获取前id不包含2的数据

可以加入多个条件进行查询,比如查询id不等于1,也不等于2的数据

        obj_list: list[Feedback] = Feedback.objects.all().exclude(id=2).exclude(id=3)  # 获取前id不包含2的数据

也可以有id等于1同时id等于2:

        obj_list: list[Feedback] = Feedback.objects.filter(id=2).filter(id=3)  # 获取id既等于2又等于3的数据

查询条件可以有多种不同的组合,比如 获取id等于2,并且是匿名的数据

        obj_list: list[Feedback] = Feedback.objects.filter(id=2).filter(anonymous=True)  # 获取id等于2,并且是匿名的数据

5、底层sql,通过调用query方法,可以查看到执行的sql语句,代码:

def submit(request):
    if request.method == 'GET':
        html = open("submit.html", encoding="utf-8").read()
        return HttpResponse(html)
    elif request.method == 'POST':
        # 获取提交的表单数据
        data = json.loads(request.body)
        print("请求数据",data)
        # obj:Feedback = Feedback.objects.filter(id=4).delete()
        obj_list: list[Feedback] = Feedback.objects.filter(id=2).filter(anonymous=True)  # 获取id等于2,并且是匿名的数据
        print(f"sql={obj_list.query}") #显示sql语句
        for obj in obj_list:
            obj.delete() #删除数据
            print(f"obj={obj}")
from django.db import connection
def my_sql():
    with connection.cursor() as cursor:
       cursor.execute("""
       SELECT "lili_feedback"."id", "lili_feedback"."quality", "lili_feedback"."attitude", "lili_feedback"."speed", "lili_feedback"."text", "lili_feedback"."anonymous", "lili_feedback"."created_at", "lili_feedback"."updated_at" FROM "lili_feedback" LIMIT 100;

       """)
       row = cursor.fetchone()
       print(row)
       return row
相关推荐
tatasix18 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。31 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了32 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度34 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮36 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
陈王卜2 小时前
django+boostrap实现发布博客权限控制
java·前端·django
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言2 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring