乐趣区

关于django:经验分享Django开发中常用到的数据库操作总结

查问类操作

1)查问所有的后果,相当 sql 中的 select * from
list = Test.objects.all()

2)条件查问,filter 相干 sql 中的 where,用于过滤查问后果
传多个参数:result = Test.objects.filter(id=1, name=’test’)
如果多条件与查问,间接用逗号隔开,filter 函数外面的参数都是 Test Model 中的字段

3)获取单个对象,get 办法的参数个别为 Model 的主键,如果找不到会报错
test_obj = Test.objects.get(id=1)

4)限度返回的后果数据的数量,相当于 sql 中的 limit,其中 order_by 是用于排序,如果依据字段 a 倒序排序,就是 order_by(“-time”)
Test.objects.order_by('name')[0:2]

5)链式查问
Test.objects.filter(name=’test’).order_by(“-ctime”)

6)多条件参数查问,传字典,结构查问条件
data = Test.objects.filter(**query_dict).order_by(“-ctime”).values
其中 query_dict 为一个字典,key 为条件字段,value 为条件值
query_dict = {'id':123,'name':’yyp’}

7)传 Q 对象,结构查问条件

  • 在 filter() 等函式中关键字参数彼此之间都是“and”关系。然而要执行更简单的查问(比方,实现筛选条件的 or 关系),能够应用 Q 对象。
  • Q 对象包含 AND 关系和 OR 关系
  • Q 对象能够用 & 和 | 运算符进行连贯。当某个操作连贯两个 Q 对象时,就会产生一个新的等价的 Q 对象

1、第一步,结构 Q 对象:
fromdjango.db.models import Q
Q(name__startswith=’h’) | Q(name__startswith=’p’)

2、第二步,Q 对象以查问参数形式应用,多个 Q 对象是 and 关系:
Test.objects.filter(
Q(date=’2018-10-10 00:00:00’),
Q(name__startswith=’h’) | Q(name__startswith=’p’)

filter() 等函数能够承受 Q 对象和条件参数,但 Q 对象必须放在条件参数后面

8)过滤不满足条件的操作
data = Test.objects.exclude(id=1)

传入条件查问
q1 = Q()
q1.connector = 'OR'              #连贯形式
q1.children.append(('id', 1))
q1.children.append(('id', 2))
q1.children.append(('id', 3))

models.Tb1.objects.filter(q1)
合并条件查问
con = Q()

q1 = Q()
q1.connector = 'OR'
q1.children.append(('id', 1))
q1.children.append(('id', 2))
q1.children.append(('id', 3))

q2 = Q()
q2.connector = 'OR'
q2.children.append(('status', '在线'))

con.add(q1, 'AND')
con.add(q2, 'AND')

models.Tb1.objects.filter(con)

减少类操作

1)新增一条记录
test1 = Test(name=’yyp’)
test1.save()


更新类操作

1)先查问获取对象,再批改对象的值,再保留
test1 = Test.objects.get(id=1)
test1.name =‘Google’
test1.save()

2)条件链式更新
Test.objects.filter(id=1).update(name=‘Google’)


删除类操作

1)先查问获取要删除的对象,而后间接 delete 操作
// 删除 id= 1 的数据
test1 = Test.objects.get(id=1)
test1.delete()

2)条件删除
Test.objects.filter(id=1).delete()

QuerySet 相干

Django 中 model 查问进去的构造类型为 QuerySet,实质是一个查问对象集。

1)将多个查问后果转换为字典列表
// all() 办法查问进去的是 QuerySet,用 values 办法转成字典集
data= Test.objects.all().values()
data_dict_list = list(data)
<QuerySet [<Test: test>]> ----><QuerySet [{“id”:XXX,“name”:XXX}]>

2)QuerySet 对象转换成字典对象
fromdjango.forms.models import model_to_dict
data = Test.objects.get(id=1)
data_dict = model_to_dict(data)

3)序列化成 json 数据

对于很多 web 开发接口的时候,要返回的是 json 数据,而 django 从 DB 查问进去的是对象集,能够思考 django-rest-framework 库的 serializers 类,具体可参考:Tutorial 1: 序列化


查问条件总结

字段名__op:
__exact 准确等于 like‘aaa’__iexact 准确等于疏忽大小写 ilike‘aaa’__contains 蕴含 like‘%aaa%’__icontains 蕴含疏忽大小写 ilike‘%aaa%’,然而对于 sqlite 来说,contains 的作用成果等同于 icontains。__gt 大于

__gte 大于等于

__lt 小于

__lte 小于等于

__in 存在于一个 list 范畴内

__startswith 以…结尾

__istartswith 以…结尾疏忽大小写

__endswith 以…结尾

__iendswith 以…结尾,疏忽大小写

__range 在…范畴内

__year 日期字段的年份

__month 日期字段的月份

__day 日期字段的日

__isnull=True/False
应用 sql 语句进行查问
fromdjango.db import connection

cursor = connection.cursor()

cursor.execute(“select * from Test where name = %s”, "yyp")

row = cursor.fetchone()

本文由腾讯蓝鲸智云编辑公布,腾讯蓝鲸智云(简称蓝鲸)软件体系是一套基于 PaaS 的技术解决方案,致力于打造行业当先的一站式自动化运维平台。目前曾经推出社区版、企业版,欢送体验。

  • 官网:https://bk.tencent.com/
  • 下载链接:https://bk.tencent.com/download/
  • 社区:https://bk.tencent.com/s-mart/community/question
退出移动版