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
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma
from .base import PrimaryModel
{%- if extend %} {# 判断是否有扩展字段,也就是model对象不包含的字段,因为查询里面还有page和pageSize等这两种字段 #}
from marshmallow import Schema, fields, INCLUDE, EXCLUDE
{%- endif %}
class {{ config['name'] | letterUpper }}Model(PrimaryModel):
__tablename__ = {% if config.get("model").get("tableName", None) != None %}'{{ config.get("model").get("tableName") }}'{% else %}'{{ application["tablePrefix"] }}{{ config['name'] }}'{% endif %}
{% for value in config['model']['fields'] %}
{%- if value.get('primaryKey', None) %}
{{ value.get('name') }} = db.Column(db.{{ value.get('dataType') }}, primary_key = True)
{%- elif value.get('dataType') == "Int" or value.get('dataType') == "Integer" %}
{{ value.get('name') }} = db.Column(db.{{ value.get('dataType') }}{% if value.get("length", None) %}{% endif %}{% if value.get("index", False) %}, index = True{% endif %}{% if value.get("required", False) %}, nullable = False{% else %}, nullable = True{% endif %}{% if value.get("default", None) != None %}, default = {{value.get("default")}}{% endif %})
{%- else %}
{{ value.get('name') }} = db.Column(db.{{ value.get('dataType') }}{% if value.get("length", None) %}({{value.get("length")}}){% endif %}{% if value.get("index", False) %}, index = True{% endif %}{% if value.get("required", False) %}, nullable = False{% else %}, nullable = True{% endif %}{% if value.get("default", None) != None %}, default = {{value.get("default")}}{% endif %})
{%- endif %}
{%- endfor %}
# __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# )
def __init__(self{% for value in config['model']['fields'] %}, {% if value.get("default", None) != None %}{{ value.get("name") }}={{ value.get("default") }}{% else %}{{ value.get("name") }}{% endif %}{% endfor %}):
{%- for value in config['model']['fields'] %}
self.{{ value.get("name") }} = {{ value.get("name") }}
{%- endfor %}
def __repr__(self):
return '<{{ config['name'] | letterUpper }}Model %r>' % (self.{{ config['model']['fields'][0]["name"] }})
def to_dict(self):
return {
{%- for item in config['model']['fields'] %}
{%- if item.get("toJson") %}
'{{ item.get("name") }}': self.{{ item.get("name") }},
{%- endif %}
{%- endfor %}
}
{% for key, value in config["view"].items() %}
class {{ key | letterUpper }}{{ config['name'] | letterUpper }}Schema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = {{ config['name'] | letterUpper }}Model
{%- if config['model']['foreignKey'] %}
include_fk = {{ config['model']['foreignKey'] }}
{% endif %}
{#
这里需要判断下,如果是数据库表的字段,则使用auto_field(),否则应该使用json配置中的字段信息
class BandMembersSchema(Schema):
# missing用来指定反序列化时默认缺省值,default用来指定序列化时默认缺省值
# 在通常的web api中,dump_only和load_only参数就类似于“read-only”和“write-only”字段
id = fields.UUID(missing=uuid.uuid1)
name = fields.String(required=True, validate=validate.Length(min=1)) # 更多校验类型,移步:https://marshmallow.readthedocs.io/en/stable/api_reference.html#api-validators
email = fields.Email(data_key="emailAddress") # 解决序列化与反序列化字段不一致问题
birthdate = fields.DateTime(default=dt.datetime(2017, 9, 29))
city = fields.String(
required=True,
error_messages={"required": {"message": "City required", "code": 400}},
)
age = fields.Int(validate=validate.Range(min=18, max=40))
permission = fields.Str(validate=validate.OneOf(["read", "write", "admin"]))
password = fields.Str(load_only=True) # password is "write-only"
created_at = fields.DateTime(dump_only=True) # created_at is "read-only"
#}
{%- for p in value['params'] %}
{%- if p.get("priority") %}
{{ p.get("name") }} = fields.{{ p.get("dataType") }}(required={{ p.get("required") }}{%- if p.get("dataType") == "String" %}, length={{ p.get("length") }}{%- endif %})
{%- elif p.get("name") in fields %}
{{ p.get("name") }} = ma.auto_field()
{%- else %}
{{ p.get("name") }} = fields.{{ p.get("dataType") }}(required={{ p.get("required") }}{%- if p.get("dataType") == "String" %}, length={{ p.get("length") }}{%- endif %})
{%- endif %}
{%- endfor %}
{{ key }}{{ config['name'] | letterUpper }}Schema = {{ key | letterUpper }}{{ config['name'] | letterUpper }}Schema()
{%- if key == "getList" %}
{{ key }}{{ config['name'] | letterUpper }}sSchema = {{ key | letterUpper }}{{ config['name'] | letterUpper }}Schema(many=True)
{%- endif %}
{% endfor %}