Skr-Eric的Django课堂(四)——Django的模型的增删改查、F、Q操作和原生数据库操作

模型

1.相关指令

1.版本切换指令

./manage.py migrate 应用名称 版本号

2.通过数据库自动导出models类

./manage.py inspectdb > 文件名.py

 

模型中的CRUD

1.增加数据

1.Entry.objects.create(属性=值,属性=值)

返回值:

插入成功:则返回创建好的实体对象

插入失败:则返回 None

2.创建一个Entry对象,并通过save()进行保存

obj = Entry(属性=值,属性=值)

obj.属性 = 值

obj.save()

无返回值,保存成功后,obj会被重新赋值

3.通过字典创建Entry对象,并通过save()进行保存

dic = {

'属性1':'值1',

'属性2':'值2',

}

obj = Entry(**dic)

obj.save()

 

2.查询数据(重难点)

通过 Entry.objects 调用查询接口函数

Entry.objects.all()

Entry.objects 提供了对该实体的所有的数据的查询

所有的接口函数,都可以通过一个 query 属性来得到所对应的sql语句

Entry.objects.all().query

1.获取所有查询结果

方法:all()

用法:Entry.objects.all()

返回:QuerySet(查询结果集,本质是一个封装了若干对象的列表)

2.查询返回指定列

方法: values() | values('列名1','列名2')

作用:查询表中数据的部分列,封装到字典中,再封装到QuerySet中

返回:QuerySet(查询结果集,本质是一个封装了若干字典的列表)

3.查询返回指定列

方法:values_list()

作用:将数据封装到元组中再封装到列表中

4.排序方法

方法:order_by()

语法:Entry.objects.order_by('列1','-列2')

默认是升序排序,列名前加-,则表示降序排序

5.查询只返回一条数据

方法:get(条件)

注意:

该方法只适用于只能查询出一条结果的场合

如果查询多于一条数据或没查询出结果都会抛出异常

返回:单个实体对象

6.根据条件查询部分行

方法:filter(条件)

返回:QuerySet

ex:

1.查询 Author 实体中 id=1 的信息

authors=Author.objects.filter(id=1)

非等值条件需要使用Field Lookups(查询谓词)

语法:Entry.objects.filter(属性__查询谓词=值)

注意:

1.每个查询谓词都是一个独立的功能条件

__exact : 等值条件判断

__gt : 大于条件判断

__year : 得到日期中的年份再进行进一步判断

__contains : 模糊查询 '%xxx%'

__range : 模糊查询 between and

... ...

2.所有支持条件查询的位置处都支持查询谓词

filter() , get() , exclude()

7.对条件取反

方法:exclude(条件)

ex:

Author.objects.exclude(id=1)

select * from index_author where not(id=1)

8.聚合查询(不带分组)

方法:aggregate(列名=聚合函数('列'))

ex:

Author.objects.aggregate(sumAge=Sum('age'))

聚合函数:

1.Avg() : 平均值

2.Count() : 数量

3.Sum() : 求和

4.Min() : 求最小值

5.Max() : 求最大值

9.聚合查询(带分组)

方法:annotate(名=聚合函数('列'))

ex:

按 id 分组 查询平均年龄

Author.objects.values('id').annotate(avgAge=Avg('age')).all()

集结 where,分组查询,having 于一体的查询接口

Author.objects

.filter(id__gte=3)  # where 子句  

.values('isActive') # group by 子句

.annotate(avgAge=Avg('age')) # 查询聚合函数

.filter(avgAge__gte=30) # having 子句

 

3.修改数据

1.修改单个实体

1.查

通过 get() 查询出要修改的实体

2.改

通过实体对象的属性赋值

3.保存

通过实体对象save()方法保存数据回数据库

2.批量修改数据

调用QuerySet的update(属性=值,属性=值)实现批量修改

 

4.删除数据

调用实体对象/查询结果集的 delete() 完成删除

1.删除单个对象

au=Author.objects.get(id=1)

au.delete()

2.批量删除

auList = Author.objects.all()

auList.delete()

 

F查询 和 Q查询

1.F()

作用:在执行过程中获取某列的值

语法:

from django.db.models import F

F('列名') :得到对应列的值

Author.objects.all().update(age=F('age')+10)

2.Q()

作用:在查询条件中可以完成 or 操作

from django.db.models import Q

Q(条件1)|Q(条件2)

查询 id大于等于3 或 年龄 < 40 的人的信息

Author.objects.filter(Q(id__gte=3)|Q(age__lt=40))

 

原生的数据库操作方法

1.查询

函数:raw(sql语句)

语法:Entry.objects.raw(sql)

返回:QuerySet

2.增删改

from django.db import connection

def doSQL(request):

  with connection.curso() as cursor:

    sql = "update index_author set age=age+10"

    cursor.execute(sql)

    return ''

 

 

 

想要看更多的课程请微信关注SkrEric的编程课堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值