知识点

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]