# 虚拟文档类型

虚拟文档类型(Virtual DocType)是文档类型(DocType)的功能扩展,它允许开发者创建具有自定义数据源和文档类型控制器的文档类型。其目的是在不创建数据库表的情况下定义系统中的自定义文档类型,同时利用框架的前端、资源API以及角色和权限。

这些虚拟文档类型在前端的功能与普通文档类型完全相同,对最终用户来说无法区分,但为开发者提供了对文档类型数据源的更多控制。通过这种方式,虚拟文档类型的数据源可以是任何东西:外部API、辅助数据库、JSON或CSV文件等。这使得开发者能够插入MariaDB和Postgres之外的数据库后端,使Frappe框架更加强大!

注意:frappe.db.* 调用仅适用于网站的数据库连接。你需要实现方法来直接查询虚拟文档类型使用的数据存储。

# 创建虚拟文档类型

要创建虚拟文档类型,在创建文档类型时只需勾选虚拟文档类型复选框:

img

# 创建自定义控制器

例如,以下控制器代码使用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

你可以在接口文件中阅读接口要求和解释。要将其他数据源与虚拟文档类型集成,你需要添加控制器方法定义数据库访问。

# 结果

虚拟文档类型的前端保持不变

img

框架定义的所有/api/resource方法与虚拟文档类型兼容。

版本13中新增

最后更新时间: 9/27/2024, 3:24:28 PM