django_ORM操作數據庫


1 create

def add_area(request):
    area = Area.objects.create(name='commom',description='a commom area',manager='vicuic')
    return HttpResponse('added successfully')
#具體的實現上,一般是web端使用post傳遞參數,然后再輸入數據庫,這里為了簡便,所以直接設定值

  

2 select

什么是查詢集?QuerySet

查詢集,也稱查詢結果集、QuerySet,表示從數據庫中獲取的對象集合。

當調用如下過濾器方法時,Django會返回查詢集(而不是簡單的列表):

  • all():返回所有數據。
  • filter():返回滿足條件的數據。
  • exclude():返回滿足條件之外的數據。
  • order_by():對結果進行排序。

 2.查詢集特性:

一:惰性執行

創建all()等過濾方法時,數據庫並不會進行實際查詢
只有當真正使用時,如遍歷的時候,才會真正去數據庫進行查詢
二:緩存

Django是動態網站,每次請求都會數據庫中進行相應的操作。當訪問量很大時,耗時就會增加。

緩存將某個views的返回值保存至內存或者memcache中,在設置的時間內,再有訪問過來時,就不再執行view中的操作,而是直接從緩存中取值
緩存機制:每次有請求進來,先去看緩存是否有,有且未過期,直接拿值 
如果緩存沒有或者已過期,就要走視圖,走數據庫 



def list_area(request):
    areas = Area.objects.all()
#返回帶所有結果的查詢集
blog_list = BlogPost.objects.all().order_by('-timestamp')
#返回所有結果的查詢集,查詢結果按照時間戳降序排列
#去掉-為升序
lines = models.UserInfo.objects.filter(username='jab',pwd='123123')
#返回filter過濾的查詢集

  

ret = list(config.objects.filter(id=id).values('dir'))[0]
#objexts這個對象使用filter,返回查詢集,然后values方法表示只要dir字段
#對查詢集使用列表轉換,然后取第一個數據

  

get()和filter()的區別:

get()返回的是一個models實例,如果沒有get到則會拋出異常。

filter()返回的是查詢集,相當於列表,如果沒有fiter到,就返回{}。

如果只有一個匹配結果:

filter().fitst() = get()

filter()[0] = get()

 

values(*fields)

返回一個ValuesQuerySet —— QuerySet 的一個子類,迭代時返回字典而不是模型實例對象。

values() 接收可選的位置參數*fields,它指定SELECT 應該限制哪些字段。如果指定字段,每個字典將只包含指定的字段的鍵/值。如果沒有指定字段,每個字典將包含數據庫表中所有字段的鍵和值。

因為ManyToManyField 字段和反向關聯可能有多個關聯的行,包含它們可能導致結果集的倍數放大。如果你在values() 查詢中包含多個這樣的字段將更加明顯,這種情況下將返回所有可能的組合。

user和roles是M2M, roles和perm也是M2M
這里就是查詢一個user關聯的所有roles,所關聯的perm不是空的查詢集。
為避免重復性,加入distinct()

 permission_menu_list = user.roles.filter(permissions__isnull=False).distinct().values(
        'permissions__title',
        'permissions__url',
        'permissions__name',
        'permissions__menu_id',  # 菜單相關
        'permissions__menu__title',
        'permissions__menu__icon',
        'permissions__parent_id',  # 父權限相關
        'permissions__parent__name'
    )

  

參考:

 https://www.cnblogs.com/rgxx/p/10382664.html

3 update

def update_area(request):
    user = User.objects.get(username='vici')
    Area.objects.filter(name='lovely').update(manager=user)
    return HttpResponse('updated!')
#Area的manager字段為User的外鍵,先獲取特定的User行賦值給user,然后在Area的行中做行更新。
#user是一個class,這里用get獲取,才能將user作為外鍵賦值給manager
#如果用filter則返回一個查詢集。無法賦值

  

4 delete

def delete_area(request):
    # Area.objects.filter(name='lovely').delete()
    User.objects.filter(username='vici').delete()
    return HttpResponse('deleted!')
#由於Area的manager是User的外鍵,並且設置了級聯刪除,所以,當刪除User中的一條數據,Area中引用這條數據的行都被刪除了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM