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