知识点
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]