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
相关推荐
KATA~8 分钟前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
xyliiiiiL24 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing25 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
用户62799471826226 分钟前
南大通用GBase 8s 获取表的约束与索引列信息
数据库
Arbori_262151 小时前
获取oracle表大小
数据库·oracle
王强你强1 小时前
MySQL 高级查询:JOIN、子查询、窗口函数
数据库·mysql
草巾冒小子1 小时前
brew 安装mysql,启动,停止,重启
数据库·mysql
用户6279947182621 小时前
南大通用GBase 8c分布式版本gha_ctl 命令-HI参数详解
数据库
斯汤雷1 小时前
Matlab绘图案例,设置图片大小,坐标轴比例为黄金比
数据库·人工智能·算法·matlab·信息可视化
SQLplusDB1 小时前
Oracle 23ai Vector Search 系列之3 集成嵌入生成模型(Embedding Model)到数据库示例,以及常见错误
数据库·oracle·embedding