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
相关推荐
今天AI了吗10 分钟前
MCP 协议打通 AI 与国产数据库,SQL 调优全流程一站式闭环
数据库·人工智能·sql
灯澜忆梦24 分钟前
【MySQL11】进阶篇 | 索引_#3使用规则
数据库·sql·mysql·性能优化
名字还没想好☜28 分钟前
Go 的 sync.Cond 实战:用条件变量做等待/通知,比忙轮询省 CPU
开发语言·数据库·后端·golang·go
wWYy.1 小时前
Mysql:有哪些锁?
数据库·mysql
李可以量化1 小时前
Tornado 从了解到精通(一)下:异步与非阻塞 IO 核心原理
java·数据库·tornado
VALENIAN瓦伦尼安教学设备2 小时前
ASHOOTER激光对中仪如何通过颜色确定调整是否合适
数据库·嵌入式硬件·算法
Wang's Blog2 小时前
AI Agent白手起家58: 项目可观测性——用 LangSmith 实现全链路追踪
数据库·人工智能
SL_staff2 小时前
JVS数字底座实践:如何复用企业文档能力快速构建知识类应用
java·数据库·程序员
qq_185198693 小时前
SpingBoot3入门学习-Web开发-三
java·数据库·学习
农村小镇哥3 小时前
C#读取CSV文件的方法
服务器·数据库·c#