django中的ORM数据库操作

一、增加

        1.save()方法:通过创建模型类对象,执⾏对象的save()⽅法保存到数据库中。

                from film.models import PeopleInfo

                f1=PeopleInfo(fname='zhangsan',age=20)

                f1.save()

        2.create()方法:模型类.objects.create()

                PeopleInfo.objects.create(fname='zhangsan',age=20)

二、修改

        1.save()方法:修改模型类对象的属性,然后执⾏save()⽅法

                f1=PeopleInfo.objects.get(fname='zhangsan')

                f1.fname='lisi'

                f1.save()

        2.update()方法:使⽤模型类.objects.filter().update(),会返回受影响的⾏数

                PeopleInfo.objects.filter(fname='zhangsan').update(fname='lisi')

三、删除

        1.模型类对象delete

                f1=PeopleInfo.objects.get(fname='zhangsan')

                f1.delete()

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

                PeopleInfo.objects.filter(fname='zhangsan').delete()

四、查询

1. 基本查询

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

        all():查询多个结果。

        count():查询结果数量。

        FilmInfo.objects.get(fid=1001)

        FilmInfo.objects.all()

        FilmInfo.objects.count()

2. 过滤查询 

filter过滤出多个结果

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

get过滤单⼀结果 对于过滤条件的使⽤,上述三个⽅法相同,故仅以filter进⾏ 讲解。

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

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

1)相等 exact:表示判等。

例:查询编号为1001的影⽚。

FilmInfo.objects.filter(fid__exact=1001)

可简写为: FilmInfo.objects.filter(fid=1001)

2)模糊查询 contains:是否包含

例:查询书名包含'我'的影⽚。

FilmInfo.objects.filter(fname__contains='我')

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

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

3) 空查询 isnull:是否为null。

例:查询影⽚名为空的影⽚。

FilmInfo.objects.filter(fname__isnull=True)

4) 范围查询 in:是否包含在范围内。

例:查询编号为1001或1003或1005的影⽚

FilmInfo.objects.filter(fid__in=[1001,1003,1005])

5)⽐较查询

gt⼤于 (greater then)

gte⼤于等于 (greater then equal)

lt⼩于 (less then)

lte⼩于等于 (less then equal)

例:查询编号⼤于1001的影⽚

FilmInfo.objects.filter(fid__gt=1001)

不等于的运算符,使⽤exclude()过滤器。

6)⽇期查询

year、month、day、week_day、hour、minute、second:对⽇期时间类型的属性 进⾏运算

例:查询2020年发表的影⽚。

FilmInfo.objects.filter(pub_date__year=2020)

五. F对象

语法:F(属性名)

之前的查询都是对象的属性与常量值⽐较,两个属性怎么⽐较呢? 答:使⽤F对 象,被定义在django.db.models中。

例:查询播放量⼤于等于评论量的影⽚。

from django.db.models import F  

FilmInfo.objects.filter(playcount__gt=F('commentcount'))

可以在F对象上使⽤算数运算。 例:查询播放量⼤于2倍评论量的影⽚。

FilmInfo.objects.filter(playcount__gt=F('commentcount')*2)

六、Q对象:

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

例:查询播放量⼤于20,并且编号⼩于1003的影⽚

FilmInfo.objects.filter(playcount__gt=20,fid__lt=1003) 

或者  FilmInfo.objects.filter(playcount__gt=20).filter(fid__lt=1003)

1.如果需要实现逻辑或or的查询,需要使⽤Q()对象结合|运算符,Q对象被定义在 django.db.models中。语法:Q(属性名__运算符=值)

例:查询播放量⼤于20的影⽚,改写为Q对象如下

FilmInfo.objects.filter(Q(playcount__gt=20))

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

例:查询播放量⼤于20,或编号⼩于1003的影⽚,只能使⽤Q对象实现

FilmInfo.objects.filter(Q(playcount__gt=20)|Q(fid__lt=1003))

3.Q对象前可以使⽤~操作符,表示⾮not。

例:查询编号不等于1003的影⽚。

FilmInfo.objects.filter(~Q(fid=1003))

七、聚合函数

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

例如:查询影⽚的总播放量。

FilmInfo.objects.aggregate(Sum('playcount'))

》》{'playcount__sum': 30000}

注意: aggregate 的返回值是⼀个字典类型:格式如下:

{'属性名__聚合类⼩写':值}

使⽤count时⼀般不使⽤aggregate()过滤器。

八、 排序

使⽤ order_by 对结果进⾏排序

# 默认升序

FilmInfo.objects.all().order_by('playcount')

# 降序

FilmInfo.objects.all().order_by('-playcount')

九、关联查询

1、由⼀到多的访问语法:

        ⼀对应的模型类对象.多对应的模型类名⼩写_set 例:

# 查询影⽚编号为1001的所有⼈物信息

film = FilmInfo.objects.get(fid=1001)

film.peopleinfo_set.all()

2、由多到⼀的访问语法:

        多对应的模型类对象.多对应的模型类中的关系类属性名 例:

# 查询⼈物编号为1的影⽚信息

person = PeopleInfo.objects.get(uid=1)

person.film

3、访问⼀对应的模型类关联对象的id语法:

        多对应的模型类对象.关联类属性_id

 person = PeopleInfo.objects.get(uid=1)

person.film_id

十、关联过滤查询

1、由多模型类条件查询⼀模型类数据:

        语法如下: 关联模型类名⼩写__属性名__条件运算符=值

        注意:如果没有"__运算符"部分,表示等于。

# 查询影⽚信息,要求影⽚⼈物为"吴京"

Film = FilmInfo.objects.filter(peopleinfo__uname='吴京')

# 查询影⽚信息,要求影⽚中⼈物的描述包含"d"

Film = FilmInfo.objects.filter(peopleinfo__desc__contains='d')

2、由⼀模型类条件查询多模型类数据:

        语法如下: ⼀模型类关联属性名__⼀模型类属性名__条件运算符=值

        注意:如果没有"__运算符"部分,表示等于。

# 查询影⽚名为“夺冠”的所有⼈物。

people = PeopleInfo.objects.filter(film__fname='夺冠')

# 查询影⽚播放量⼤于30的所有⼈物

people = PeopleInfo.objects.filter(film__playcount__gt=30)

1. 概念

Django的ORM中存在查询集的概念。 查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。

判断某⼀个查询集中是否有数据: exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。

2. 两⼤特性

1)惰性执⾏ 当执⾏查询操作返回QuerySet时,默认查询前21条数据。

        FilmInfo.objects.all()

        查看映射SQL:select * from t_filminfo limit 21;

2)缓存 默认情况下,QuerySet会把结果存放在内置当缓存中。 QuerySet提供了 _result_cache 的变量专⻔存储缓存。

films = FilmInfo.objects.all() # 当执⾏完这条语句后,films._result_cache能够查看到结果

3. 限制查询集 可以对查询集进⾏取下标或切⽚操作,等同于sql中的 limit 和 offset ⼦句。

注意:不⽀持负数索引。

对查询集进⾏切⽚后返回⼀个新的查询集,不会⽴即执⾏查询。 如果获取⼀个对象,直接使⽤[0],等同于[0:1].get(),但是如果没有数据,[0]引发 IndexError异常,[0E1].get()如果没有数据引发DoesNotExist异常。

示例:获取第1、2项,运⾏查看。

films = FilmInfo.objects.all()[0:2]

<QuerySet [<FilmInfo:夺冠>,<FilmInfo:金刚川>] >

4、分页

#查询数据

films = FilmInfo.objects.all()

#导⼊分⻚类

from django.core.paginator import Paginator

#创建分⻚实例

paginator=Paginator(films,2)

#获取指定⻚码的数据

page_skus = paginator.page(1)

#获取分⻚数据

total_page=paginator.num_pages

分页链接:https://docs.djangoproject.com/en/2.2/topics/pagination/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django自带的ORM是一个Python对象关系映射工具,它可以让开发者使用Python语言进行数据库操作,而不需要手写SQL语句。 使用Django自带的ORM进行数据库操作的步骤如下: 1. 定义模型类:在Django应用的models.py文件定义模型类,其每个模型类对应一个数据库表。 2. 进行迁移:运行python manage.py makemigrations命令生成数据库迁移文件,再运行python manage.py migrate命令将模型类映射到数据库表。 3. 进行CRUD操作:使用模型类提供的方法进行数据库的增删改查操作,如: - 创建对象:使用模型类的save()方法或create()方法创建新的数据库记录。 - 查询对象:使用模型类的objects属性进行查询,可以使用filter()、get()、all()等方法进行过滤和排序。 - 更新对象:使用模型类的save()方法或update()方法更新数据库记录。 - 删除对象:使用模型类的delete()方法删除数据库记录。 示例代码: ```python # 定义模型类 from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=50) price = models.DecimalField(max_digits=5, decimal_places=2) pub_date = models.DateField() is_published = models.BooleanField(default=True) # 创建对象 book = Book(title='Python入门', author='张三', price=29.99, pub_date='2022-01-01') book.save() # 查询对象 books = Book.objects.filter(author='张三').order_by('-price') for book in books: print(book.title, book.price) # 更新对象 book.price = 39.99 book.save() # 删除对象 book.delete() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值