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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
'''
Author: your name
Date: 2021-07-27 16:19:06
LastEditTime: 2021-07-28 09:23:23
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\models\menu.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime
from application.app import db
from .base import PrimaryModel
# from sqlalchemy.orm import relationship
from sqlalchemy_mptt.mixins import BaseNestedSets
class MenuModel(PrimaryModel, BaseNestedSets):
__tablename__ = 'evm_menu'
id = db.Column(db.Integer, primary_key=True)
# disabled = db.Column(db.Boolean, default = False)
icon = db.Column(db.String(100), nullable = True, default = '')
name = db.Column(db.String(100), nullable = True)
# tree_id = db.Column(db.Integer, default=0, nullable = True)
# parent_id = db.Column(db.Integer, db.ForeignKey("evm_menu.id"), default=0, nullable = True) # 这句话会由mptt自动插入进去
path = db.Column(db.String(100), nullable = True)
# lft = db.Column(db.String(100), nullable = True)
# rgt = db.Column(db.String(100), nullable = True)
# visible = db.Column(db.Boolean, default = True)
# level = db.Column(db.Integer, primary_key=True)
# disabled = db.Column(db.Boolean, nullable = True, default = False)
# fixed = db.Column(db.Boolean, nullable = False, default = False)
# has_children = db.Column(db.Boolean, nullable = True, default = False)
# create_at = db.Column(db.DateTime, default=datetime.now) # 下面这些被注释的字段,都已经从PrimaryModel继承过来了,无需重写
# create_by = db.Column(db.String(64))
# update_at = db.Column(db.DateTime, default=datetime.now)
# update_by = db.Column(db.String(64))
# remarks = db.Column(db.String(255), default="")
# sort = db.Column(db.Integer, default=0)
# is_delete = db.Column(db.Boolean, default=0)
# parent = db.Column(db.Integer, db.ForeignKey('evm_menu.id'), index=True)
# 这句话的含义请百度sqlalchemy表自关联,https://www.jianshu.com/p/fa611ab55dd2
parent = db.relationship("MenuModel", remote_side=[id], backref="children")
# sqlalchemy_mptt 调优
# sqlalchemy_mptt 在混入ORM对象时,只对rgt, lft, level 设置了索引,导致每次 CRUD操作都需要从头到尾查找。
# 经测试,添加tree_id索引大约能快4倍,添加parent_id大约快100倍,加起来就能够满足快速插入的需求了
# https://www.cnblogs.com/estragon/p/12298128.html
__table_args__ = (
db.Index('right_idx', 'rgt'),
db.Index('left_idx', 'lft'),
db.Index('level_idx', 'level'),
db.Index('treeid_idx', 'tree_id'),
db.Index('parent_idx', 'parent_id'),
)
def __init__(self, name=None, parentId=None, path="", disabled=False, fixed=False, hasChildren=False, icon='', is_delete=False, sort=0, create_by=None, create_at=None, update_by=None, update_at=None, remarks=""):
self.name = name
self.parent_id = parentId
self.path = path
self.disabled = disabled
self.fixed = fixed
self.has_children = hasChildren
self.icon = icon
self.is_delete = is_delete
self.sort = sort
self.create_by = create_by
self.create_at = create_at
self.update_by = update_by
self.update_at = update_at
self.remarks = remarks
def __repr__(self):
return '<MenuModel %r>' % (self.id)
@classmethod
def fields_mapping(self):
return {
'parendId': 'parent_id',
'hasChildren': 'has_children'
}
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'parentId': self.parent_id,
'path': self.path,
'disabled': self.disabled,
'fixed': self.fixed,
'hasChildren': self.has_children,
'icon': self.icon,
'sort': self.sort,
'remark': self.remark,
'deleted': self.is_delete,
'createUser': self.create_by,
'updateUser': self.update_by,
'createTime': self.create_at.strftime("%Y-%m-%d %H:%M:%S") if self.create_at else None,
"updateTime": self.update_at.strftime("%Y-%m-%d %H:%M:%S") if self.update_at else None,
}