CKan toolkit.get_action 函数在按 package_count 排序时给出空列表
CKan toolkit.get_action function is giving empty list when sorting by package_count
我是 CKAN 的新手,遇到了模板助手的问题。特别是在我的例子中,我将不得不在我自己的模板助手中调用 toolkit.get_action('group_list')
。但是,当我添加如下约束时:
results = toolkit.get_action('group_list')(data_dict={'sort': 'package_count desc',
'type': 'MyType',
'all_fields': True})
我得到的结果是一个空列表。如果我从 data_dict
中删除 'sort' 约束,我可以获得使用 'MyType' 列出组的结果。我不知道是什么导致了这个问题,因为当我按照ckan toolkit official examples时,它没有任何问题。但是,我能想到的是这个自定义组可能有自己的架构,因此 package_count 不能用作排序键。由于没有错误信息,我不能做进一步的假设。
我想出了我自己的问题。我在问题中展示的实现是正确的。但是,数据库未正确填充。基本上你必须为特定的组填充一些包。如果您在每个组中都没有包,则此函数将 return 一个空查询结果。在@DRead的指点下,我研究了_group_or_org_list()
的源码。如果您看一下这段代码:
if sort_info and sort_info[0][0] == 'package_count':
query = model.Session.query(model.Group.id,
model.Group.name,
sqlalchemy.func.count(model.Group.id))
query = query.filter(model.Member.group_id == model.Group.id) \
.filter(model.Member.table_id == model.Package.id) \
.filter(model.Member.table_name == 'package') \
.filter(model.Package.state == 'active')
else:
query = model.Session.query(model.Group.id,
model.Group.name)
如果您没有为组创建包,filter(model.Member.table_id == model.Package.id)
将过滤掉所有组。
我是 CKAN 的新手,遇到了模板助手的问题。特别是在我的例子中,我将不得不在我自己的模板助手中调用 toolkit.get_action('group_list')
。但是,当我添加如下约束时:
results = toolkit.get_action('group_list')(data_dict={'sort': 'package_count desc',
'type': 'MyType',
'all_fields': True})
我得到的结果是一个空列表。如果我从 data_dict
中删除 'sort' 约束,我可以获得使用 'MyType' 列出组的结果。我不知道是什么导致了这个问题,因为当我按照ckan toolkit official examples时,它没有任何问题。但是,我能想到的是这个自定义组可能有自己的架构,因此 package_count 不能用作排序键。由于没有错误信息,我不能做进一步的假设。
我想出了我自己的问题。我在问题中展示的实现是正确的。但是,数据库未正确填充。基本上你必须为特定的组填充一些包。如果您在每个组中都没有包,则此函数将 return 一个空查询结果。在@DRead的指点下,我研究了_group_or_org_list()
的源码。如果您看一下这段代码:
if sort_info and sort_info[0][0] == 'package_count':
query = model.Session.query(model.Group.id,
model.Group.name,
sqlalchemy.func.count(model.Group.id))
query = query.filter(model.Member.group_id == model.Group.id) \
.filter(model.Member.table_id == model.Package.id) \
.filter(model.Member.table_name == 'package') \
.filter(model.Package.state == 'active')
else:
query = model.Session.query(model.Group.id,
model.Group.name)
如果您没有为组创建包,filter(model.Member.table_id == model.Package.id)
将过滤掉所有组。