zoukankan      html  css  js  c++  java
  • Python Django orm操作数据库笔记之QuerySet API

    什么时候Django会将QuerySet转换为SQL去执行:

    根据Django的数据库机制,对于QuerySet来说,当QuerySet被第一次构建,然后又调用他的filter方法,接着在对其进行切片操作的过程中,Django其实并没有去访问数据库。只有当你对QuerySet进行求值时,Django才会去访问数据库。

    在以下情况下QuerySet会被转换为SQL语句执行:

    迭代:在遍历QuerySet对象的时候,会首先先执行这个SQL语句,然后再把这个结果返回进行迭代。比如以下代码就会转换为SQL语句:

    使用步长做切片操作:QuerySet可以类似于列表一样做切片操作。做切片操作本身不会执行SQL语句,但是如果如果在做切片操作的时候提供了步长,那么就会立马执行SQL语句。需要注意的是,做切片后不能再执行filter方法,否则会报错。

    调用len函数:调用len函数用来获取QuerySet中总共有多少条数据也会执行SQL语句。

    调用list函数:调用list函数用来将一个QuerySet对象转换为list对象也会立马执行SQL语句。

    判断:如果对某个QuerySet进行判断,也会立马执行SQL语句。

    1.defer和only方法

    这两个方法都是返回一个QuerySet对象,并且这个QuerySet对象包裹的是相应的模型,而不是字典,且使用这两个方法过滤或只提取某几个字段后,再使用已被过滤或者未提取的某个字段时,系统会重新发送一次查询请求。因此要慎重操作。

    defer:过滤相应字段(一个或多个)
    only:只提取相应字段(一个或多个)

    2.get

    作用是获取满足条件的一条数据,需要注意的是该函数只能令其返回有且只有一条数据,因此如果给出的条件有多条数据满足那么这个方法将会抛出MultipleObjectsReturned错误,如果没有数据满足,那么将会抛出DoesNotExit错误。

    3.create

    创建一条数据,并将其保存到数据库中

    4.get_or_create

    根据某个条件进行查找,如果找到了那么就返回这条数据,如果没有查找到,那么就创建一个。

    5.bulk_create

    可以接收一个列表参数,并根据列表内元素一次性创建多条数据。通过该方法向数据库插入数据时仅生成一条SQL语句。

    6.distinct

    去除掉那些重复的数据。这个方法如果底层数据库用的是MySQL,那么不能传递任何的参数。需要注意的是distinct方法判断数据是否重复的依据是数据中的每一个字段都同。

    7.切片操作

    QuerySet使用切片操作就跟列表使用切片操作是一样的。示例代码如下:

    books = Book.objects.all()[1:5:2]
    

    切片操作并不是把所有数据从数据库中提取出来再做切片操作。而是在数据库层面使用LIMIE和OFFSET来帮我们完成。

  • 相关阅读:
    jvm-类加载
    jvm调优
    jdk8与jdk9的共存
    eclipse的插件开发-启动时间
    斐波那契数列算法逐层优化(C++)
    2G.处女座与复读机(C++)
    3I.处女座的约会(C++)
    3D.处女座的训练(C++)
    3E.处女座和小姐姐(C++)
    3C.处女座点名(C++)
  • 原文地址:https://www.cnblogs.com/biechishaobing/p/10394981.html
Copyright © 2011-2022 走看看