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中引用這條數據的行都被刪除了
