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
相关推荐
Mr.131 小时前
数据库的三范式是什么?
数据库
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Python之栈1 小时前
【无标题】
数据库·python·mysql
风_流沙2 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
亽仒凣凣2 小时前
Windows安装Redis图文教程
数据库·windows·redis
亦世凡华、2 小时前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析
YashanDB2 小时前
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
数据库·yashandb·崖山数据库
ProtonBase2 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
云和数据.ChenGuang7 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys8 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver