Web开发(十四)Django数据库增删改查

一、增

增加数据有两种方法

1、save

通过创建模型类对象,执行对象的save()方法保存到数据库中

sp = ServiceProcess()    # models.py中的表对象

sp.id=22

sp.pid =8888

sp.save()

2、create

通过模型类.objects.create()保存。

ServiceProcess.objects.create(    

        id=77,

        pid =89543)

二、查

1、基本查询

get :查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。

all :查询多个结果。

count :查询结果数量

1.1 get

sp = ServiceProcess.objects.get(pid=8888)

print(p.id)

1.2 all

sp = ServiceProcess.objects.all()

1.3 count

ServiceProcess.objects.count()

2、过滤查询

实现SQL中的where功能,包括:

filter 过滤出多个结果

exclude 排除掉符合条件剩下的结果

get 过滤单一结果


过滤条件的表达语法如下:

属性名称__比较运算符=值

# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线

exact:表示判等。

contains:是否包含。

startswith、endswith:以指定值开头或结尾。

以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.

isnull:是否为null。

in:是否包含在范围内。

gt :大于 (greater then)

gte :大于等于 (greater then equal)

lt :小于 (less then)

lte :小于等于 (less then equal)

yearmonthdayweek_dayhourminutesecond:对日期时间类型的属性进行运算。


F对象

之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢?

使用F对象,被定义在django.db.models中!

语法如下:

F(属性名)

ServiceProcess.objects.filter(pid__gte=F('id'))    #  查询pid大于id的数据

可以在F对象上使用算数运算。

ServiceProcess.objects.filter(pid__gte=F('id')*2)    #  查询pid大于2倍id的数据


Q对象

多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。

ServiceProcess.objects.filter(pid__gt=20,id_lt=3)    # pid大于20,id小于3的数据

如果需要实现逻辑or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。

语法如下:

Q(属性名_运算符=值)

Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。

ServiceProcess.objects.filter(Q(pid__gt=20) | Q(id_lt=3))    # pid大于20或id小于3的数据

Q对象前可以使用~操作符,表示not。

ServiceProcess.objects.filter(~Q(pid=20))    # pid不等于20数据


聚合函数

使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg(平均),Count(数量),Max(最大),Min(最小),Sum(求和),被定义在django.db.models中。

ServiceProcess.objects.aggregate(Max('pid'))    # 最大pid的数据


3、排序

使用order_by对结果进行排序。-属性表示降序。

ServiceProcess.objects.all.order_by('pid')   # 升序

ServiceProcess.objects.all.order_by('-pid')   # 降序

4、关联查询(多表查询)

table_a中的一条记录唯一关联table_b中的一条记录

table_b中的记录可以被table_a中的多条记录关联

此时,此时模型类A简称多类,模型类B成为一类

由一到多的访问语法:一类对象.多类名小写_set.all()。

例如:在HeroInfo和BookInfo中,BookInfo为一类,而HeroInfo为多类,则通过BookInfo的对象查询对应的HeroInfo对象的方式为:

books = BookInfo.objects.all()

for book in books:

        for hero in book.heroinfo_set.all():

                print(hero.hero_name)

由多到一的访问语法: 多类对象.关联属性

例如:在HeroInfo和BookInfo中,BookInfo为一类,而HeroInfo为多类,多类中有一个关联属性hero_book,则通过HeroInfo的对象查询对应的BookInfo对象的方式为:

from booktest.models import BookInfo, HeroInfo

for hero in HeroInfo.objects.all():

        print(hero.hero_book.book_title)


三、改

修改更新有两种方法

1、save

修改模型类对象的属性,然后执行save()方法

hero = HeroInfo.objects.get(hname='猪八戒')

hero.hname = '猪悟能'hero.save()

2、update

使用模型类.objects.filter().update(),会返回受影响的行数

HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')


四、

删除有两种方法

1、模型类对象.delete

hero = HeroInfo.objects.get(id=13)

hero.delete()

2、模型类.objects.filter().delete()

HeroInfo.objects.filter(id=14).delete()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容