知識點
Q查詢的應用及查詢關鍵字
from django.db.models import Q
#實例化出一個Q對象
q=Q()
#往q中添加第一個條件
q.children.append(("price", 100))
#往q中添加第二個條件
q.children.append(("title", "python"))
#這裏也可以使用變量,例如q.children.append((field+"contains", val))
此時打印q
[('price__100', 'linux'), (title__contains', 'python')]
#最後把q放到CRM語句中進行查詢
Book.objects.filter(q)
默認模式兩個條件之間是且的關係,調整成或的關係(在添加條件之前執行)
q.connector="or"
Django各種條件查詢關鍵字
__exact 精確等於 like ‘aaa’
__iexact 精確等於 忽略大小寫 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小寫 ilike ‘%aaa%’,但是對於sqlite來說,contains的作用效果等同於icontains。
__gt 大於
__gte 大於等於
__lt 小於
__lte 小於等於
__in 存在於一個list範圍內
__startswith 以…開頭
__istartswith 以…開頭 忽略大小寫
__endswith 以…結尾
__iendswith 以…結尾,忽略大小寫
__range 在…範圍內
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
知識點_獲取函數的名稱
def foo():
pass
print(foo.__name__)
#結果是個字符串
foo
stark組件_search功能的實現
要實現的功能:
在搜索框中輸入任何,則顯示相應內容,(例如輸入python,只顯示跟有python關鍵字的內容)
思路
跟list_display一樣的思路,在自定義配置類中設置一個search_fields = ["title", "price"],
搜索時,如果有自定義的self.search_fields,就按照自定義的執行,沒有的話就按照默認ModelStark中的search_fields爲空執行
1.在list_view中引入Q查詢,並實例化出一個對象,因爲有多個查詢條件,且要用到變量,這裏使用Q查詢的功能
2.取到頁面傳過來的值(查詢內容)
3.判斷是否有值
4.把Q查詢的實例對象多查詢條件的關係調整爲“或”
5.循環查詢字段的列表(search_fields)
6.把查詢條件添加到Q查詢中
7.在ORM語句中使用Q查詢的實例化對象作爲查詢條件
8.把查詢結果返回給頁面
代碼參考
def get_search_condition(self, request):
# ---處理search功能開始---
from django.db.models import Q
# 實例化一個Q
search_condition = Q()
# 取到頁面傳進來的值
val = request.GET.get("q")
if val:
search_condition.connector = "or"
# self.search_fields裏面是["title", "price"]
for field in self.search_fields:
#添加查詢條件元祖左邊是字段名,右邊是查詢內容,__contains是模糊查詢的意思
search_condition.children.append((field + "__contains", val))
# ---處理search功能結束---
return search_condition
stark組件_action功能的實現
思路
第一階段:構建訪問頁面:
1.自定義配置類中設置功能函數(BookConfig)
例如批量初始化,批量刪除,每個功能對應一個函數,函數內是對數據庫的操作邏輯2.把這些函數放入到一個列表中,例如actions = [patch_init, patch_delete],這裏面是一個個的函數
這個列表確定了訪問相應頁面時action到底有什麼選項
別忘了在ModelStark中也設置個actions = [],如果相應表單沒有自定義actions就走這個公共的3.在sites.py中的Show_List類中新增一個函數處理action功能需求,比如叫get_new_actions
4.在這個get_new_actions中循環自定義配置類中的actions列表,獲取到一個個的函數
5.通過每個函數獲取到這個函數的中文名(用於顯示在頁面給用戶看),以及這個函數本身的名字(str)
(用於作爲頁面中select的value,未來要通過這個value來獲知用戶到底選擇的是哪個功能)
6.把上面獲取到的兩個信息拼到一個列表中,作爲get_new_actions這個函數的返回值
7.因爲傳給模板的是一個Show_List類的實例對象,例如叫它sl,因此通過sl.get_new_actions模板就可以獲得上面的數據
至此,用戶訪問的頁面就構建完了
第二階段:執行action操作
此時用戶在頁面上勾選了多選框,在select中選擇了要執行的操作(例如批量刪除),點擊Go按鈕,提交了post請求
1.在視圖中,通過post請求獲取到要執行功能的函數名,就是頁面中select的value,,利用反射將它換成一個函數
2.獲取記錄的主鍵值,也就是用戶到底選擇操作哪幾條數據
3.執行第一步獲取到的函數,同時把主鍵值作爲參數傳進去
第三階段:修改數據,構建新頁面
1.例如此時執行的是自定義配置類中的patch_delete函數,就通過傳過去的主鍵值找出相應數據庫條目,做刪除操作
2.之後繼續走視圖函數中的剩餘代碼,最後通過render構建頁面
3.此時返回給用戶的新頁面就是做了刪除的頁面
至此流程走完了
示例代碼
#Show_List類中
def get_new_actions(self):
action_list = []
for i in self.config.actions:
action_list.append({
#獲取註釋
"desc": i.desc,
#獲取變量名
"name": i.__name__,
})
return action_list
#ModelStark類中
def list_view(self, request):
if request.method == "POST":
action = request.POST.get("action")
selected_pk = request.POST.getlist("selected_pk")
print("selected_pk==>", selected_pk)
action = getattr(self, action)
action(selected_pk)
#自定義配置類中
def patch_init(self, selected_pk):
self.model.objects.filter(pk__in=selected_pk).update(price=0)
patch_init.desc = "批量初始化"
def patch_delete(self, selected_pk):
self.model.objects.filter(pk__in=selected_pk).delete()
patch_delete.desc = "批量刪除"
actions = [patch_init, patch_delete]