与QuerySet和管理器协同工作

本节将讨论如何从数据库中获取信息并与其进行交互。

Django设置了强大的数据库抽象API,并以此方便地创建、获取、更新及删除对象。同时,Django的对象关系映射器(ORM)兼容于Mysql/PostgreSQL/SQLite/Oracle及MariaDB。

Django ORM基于QuerySets,一个QuerySets可视为一个数据库查询集合,以检索数据库中的对象,用户可在QuerySets上使用过滤器,进而根据给定的参数来缩小查询结果的范围。

一、创建对象

python manage.py shell 启动Python shell

方法一:通过实例化模型对象,再加上.save()来持久化

方法二:直接使用模型.objects.create()来创建

二、更新对象

直接赋值,save()方法执行了Update语句

三、检索对象

每个Django模型至少包含一个管理器,并且默认将管理器称作objects。通过模型管理器,可以得到一个QuerySets对象。

1.获取所有内容

Post.objects.all()

2.使用filter()方法

Post.objects.filter()

注意:包含字段查找方法的查询操作可采用两个下画线予以构建,如publish__year,但同一标记也可用于相关模型的访问字段,如author__username。

3.使用exclude()方法

此方法,可以排除QuerySets中特定的结果。

例如,可获取标题不是以Why开始的,发布于2022年的全部帖子,如下所示:

4.使用order_by()方法

此方法可以对结果进行排序,在字段前加-(负号)表示降序排列。

四、删除对象

注意:删除对象也会删除ForeignKey对象(on_delete设置为CASCADE)的依赖关系。

五、评估QuerySet

QuerySet的创建过程在其被评估之前并不会涉及数据库操作。通常其返回另一个未被评估的QuerySet。我们可以连接多个过滤器到一个QuerySet上,在QuerySet计算之前都不会访问数据库。

QuerySet仅在下列场景被计算:

  • 首次迭代时
  • 当对QuerySet访问时,如Post.objects.all()[:3]
  • 当对QuerySet缓存时
  • 当对QuerySet上调用repr()或len()时
  • 当在QuerySet上显式调用List()时
  • 当在某个语句中对QuerySet进行测试时,如bool(),or,and 或者if

六、创建模型管理器

通常一个模型默认一个objects管理器,我们可以在models.py文件中定义自己的模型管理器。

注意点:

  • 继承models.Manager,重写get_queryset()方法
  • 想要同时使用默认的管理器,必须要显示申明
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享