Q: 如何在列表页自定义列从接口批量查询(列表页上所有的一列数据走一个批量接口)
A:
如果自定义列, 每一行记录都去查一个接口, 可以直接在models里或者在OptionClass里定义方法, 然后加到list_display属性当中即可.
现在想列表页所有的数据库记录走一个批量接口. 然后判断每一行记录的状态. 也就是一次request请求, 去请求一次接口. 如果在models里或者OptionClass里加方法的话. 或者写在__init__
方法里, 实际上每一行数据库记录都会执行一遍. 这样会发生多次请求.
这里的实现方式是使用xadmin提供的插件. 继承BaseAdminPlugin
实现其filter_hook的get方法, get方法只在请求的过程中执行一次. 第一个参数名称用__
,这样调用plugins里的get方法之前ListAdminView
里 get不被执行(执行了就报错了, 会找不到vt_status这个Field). 通过修改self.model也就是当前的数据库对象的field来实现.
plugins.py
from xxx_middle.api.vt import VirusTotal
from xadmin.views import BaseAdminPlugin
class VtStatusPlugin(BaseAdminPlugin):
show_vt_status = False
def init_request(self, *args, **kwargs):
return bool(self.show_vt_status)
def get(self, __, *args, **kwargs):
# filter_hook
# 每次get请求, 请求VT一次
all_vt_ruleset_data = VirusTotal.hunting_rulesets_list()
all_vt_ruleset_status = {i["attributes"]["name"]: i["attributes"]["enabled"] for i in
all_vt_ruleset_data}
def vt_status(model_self):
# 每个model对象调用vt_status一次, 每个请求调用vt_status多次
if model_self.name in all_vt_ruleset_status:
vt_status = "已启用" if all_vt_ruleset_status[model_self.name] else "未启用"
else:
vt_status = "不存在"
return vt_status
vt_status.short_description = "VT状态"
self.model.vt_status = vt_status
return __()
adminx.py
from .plugins import VtStatusPlugin
from xadmin.views import ListAdminView
class YaraRulesetAdmin:
list_display = ["name", "source", "create_user", "update_user", "update_time", "vt_status", "status"]
list_filter = ["name", "source", "update_user", "update_time", "status"]
exclude = ['create_time', 'lookup_users', 'create_user', 'update_user', 'update_time', 'import_list',
"scan_file_path_list", "rule_list"]
# 禁用导出功能
list_export = []
# 通过插件额外显示vt_status
show_vt_status = True
xadmin.site.register_plugin(VtStatusPlugin, ListAdminView)
###