# 虚拟文档类型
虚拟文档类型(Virtual DocType)是文档类型(DocType)的功能扩展,它允许开发者创建具有自定义数据源和文档类型控制器的文档类型。其目的是在不创建数据库表的情况下定义系统中的自定义文档类型,同时利用框架的前端、资源API以及角色和权限。
这些虚拟文档类型在前端的功能与普通文档类型完全相同,对最终用户来说无法区分,但为开发者提供了对文档类型数据源的更多控制。通过这种方式,虚拟文档类型的数据源可以是任何东西:外部API、辅助数据库、JSON或CSV文件等。这使得开发者能够插入MariaDB和Postgres之外的数据库后端,使Frappe框架更加强大!
注意:frappe.db.* 调用仅适用于网站的数据库连接。你需要实现方法来直接查询虚拟文档类型使用的数据存储。
# 创建虚拟文档类型
要创建虚拟文档类型,在创建文档类型时只需勾选虚拟文档类型复选框:

# 创建自定义控制器
例如,以下控制器代码使用JSON文件作为文档类型数据源:
class VirtualDoctype(Document):
""“这是虚拟文档类型控制器的示例。
- 它使用磁盘上的单个JSON文件作为“后端”。
- 键是docname,值是文档本身。
示例:
{
"doc1": {"name": "doc1", ...}
"doc2": {"name": "doc2", ...}
}
"""
DATA_FILE = "data_file.json"
@staticmethod
def get_current_data() -> dict[str, dict]:
""“从磁盘读取数据”""
if not os.path.exists(VirtualDoctype.DATA_FILE):
return {}
with open(VirtualDoctype.DATA_FILE) as f:
return json.load(f)
@staticmethod
def update_data(data: dict[str, dict]) -> None:
""“将更新后的数据刷新到磁盘”""
with open(VirtualDoctype.DATA_FILE, "w+") as data_file:
json.dump(data, data_file)
def db_insert(self, *args, **kwargs):
d = self.get_valid_dict(convert_dates_to_str=True)
data = self.get_current_data()
data[d.name] = d
self.update_data(data)
def load_from_db(self):
data = self.get_current_data()
d = data.get(self.name)
super(Document, self).__init__(d)
def db_update(self, *args, **kwargs):
# 对于这个示例,插入和更新是相同的操作,
# 对于你来说可能有所不同。
self.db_insert(*args, **kwargs)
def delete(self):
data = self.get_current_data()
data.pop(self.name, None)
self.update_data(data)
@staticmethod
def get_list(args):
data = VirtualDoctype.get_current_data()
return [frappe._dict(doc) for name, doc in data.items()]
@staticmethod
def get_count(args):
data = VirtualDoctype.get_current_data()
return len(data)
@staticmethod
def get_stats(args):
return {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
你可以在接口文件中阅读接口要求和解释。要将其他数据源与虚拟文档类型集成,你需要添加控制器方法定义数据库访问。
# 结果
虚拟文档类型的前端保持不变

框架定义的所有/api/resource方法与虚拟文档类型兼容。
版本13中新增