在 Keystone 管理列表视图中,方便的下载链接导出 CSV 文件中的所有列表项,但是,如果某些字段是关系类型,则导出的 CSV 包含 Mongo ObjectIDs 而不是有意义的字符串(名称、标题等),这将是有用。
如何强制 ObjectID 被另一个字段映射/替换?
在 Keystone 管理列表视图中,方便的下载链接导出 CSV 文件中的所有列表项,但是,如果某些字段是关系类型,则导出的 CSV 包含 Mongo ObjectIDs 而不是有意义的字符串(名称、标题等),这将是有用。
如何强制 ObjectID 被另一个字段映射/替换?
Keystone 有一个未记录的功能,允许您创建自己的自定义 CSV 导出功能。此功能是在 4 月添加的(请参阅KeystoneJS 问题 #278)。
您需要做的就是向名为toCSV
. 当指定为此方法的参数时,Keystone 将注入以下任何依赖项。
- req (current express request object)
- user (currently authenticated user)
- row (default row data, as generated without custom toCSV())
- callback (invokes async mode, must be provided last)
例如,您可以使用 Mongoose Model.Populate方法将任何关系字段的对象 ID 替换为您想要的任何数据。
假设您有一个Post
列表,其中包含一个author
字段Types.Relationship
到另一个列表(比方说User
),该列表具有一个name
字段。您可以通过执行以下操作将author
对象 ID 替换为作者的姓名(来自User
列表)。
Post.schema.methods.toCSV = function(callback) {
var post = this,
rtn = this.toJSON();
this.populate('author', function() {
rtn.author = post.author.name; // <-- author now has data from User list
callback(null, rtn);
});
};
.toCSV()
将为每个返回的文档调用Model
作为上下文。当异步使用时(如上所述),您应该通过将新 CSV 数据作为回调的第二个参数传递来返回新 CSV 数据的 JSON 表示。当同步使用它时,只需返回更新的 JSON 对象。