zoukankan      html  css  js  c++  java
  • Python学习---django惰性机制

    Django惰性机制

    所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。

    惰性机制之可迭代

    # objs=models.Book.objects.all() # [obj1,obj2,ob3...]
    # for obj in objs: # 每一obj就是一个行对象,此时会执行sql
    #     print("obj:",obj)
    

    惰性机制之可切片

    # objs=models.Book.objects.all() # [obj1,obj2,ob3...]
    # print(objs[1])
    # print(objs[1:4])
    # print(objs[::-1])
    

    惰性机制之Django缓存问题

        Django有自己的缓存,如果2次的obj对象一致,第二次的查值直接从缓存中取值。

        如果期间数据库的内容作了更改,则需要重新查值。否则容易产生脏数据。

        可以直接利用第一次的obj对象直接进行update操作,这样下次for循环查询时又重新执行了数据库查询操作,此时缓存也作了更改; 也可以重新手动查询一下结果,但是不推荐这样,因为我们并不知道数据什么时候会进行修改,妥善的还是Django用数据时自己去查询数据结果

    注意1: 如果2次操作之间有数据进行了修改 ,则需要重新从数据库中查值,否则Django会从缓存中取出数据,影响最后的查询结果。

    # objs=models.Book.objects.all()    # [obj1,obj2,ob3...]
        # for obj in objs:             # 每一obj就是一个行对象,此时会执行sql
        #     print("obj:",obj)
        Models.Bool.update.get(id=2).update('title'='YYY') # 数据库内更改,缓存未更改
    # objs=models.Book.objects.all()  重新从数据库内查找并赋值给objs
    # objs.update(title='YYY') 推荐使用,直接数据库/内存都更改了,下面for循环查询时重新执行了数据库
        # objs=models.Book.objects.all()    # [obj1,obj2,ob3...]
        # for obj in objs:             
        #     print("obj:",obj)             # 还是objs对象,所以从缓存中取值

    正确操作

       1. 重新执行查询 objs=models.Book.objects.all() 【不推荐】

        2. 利用objs.update(title='YYY');  此时数据库已经更改,缓存内的值也做了更改

    注意2:

    if objs():        查询数据库,并且将查询的所有数据结果放入数据库内
    if objs.exist():  仅仅查询数据库,但是不会把所有的数据放入数据库内,
    if obj.iterator():数据放入迭代器内,用一次迭代一次取一次即可
  • 相关阅读:
    Anagram
    HDU 1205 吃糖果(鸽巢原理)
    Codeforces 1243D 0-1 MST(补图的连通图数量)
    Codeforces 1243C Tile Painting(素数)
    Codeforces 1243B2 Character Swap (Hard Version)
    Codeforces 1243B1 Character Swap (Easy Version)
    Codeforces 1243A Maximum Square
    Codeforces 1272E Nearest Opposite Parity(BFS)
    Codeforces 1272D Remove One Element
    Codeforces 1272C Yet Another Broken Keyboard
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9399265.html
Copyright © 2011-2022 走看看