model.tpl 4.86 KB
#!/usr/bin/env python
# -*- coding: utf_8 -*-

from application.app import db, ma
from .base import PrimaryModel
{%- if extend %} {# 判断是否有扩展字段,也就是model对象不包含的字段,因为查询里面还有pagepageSize等这两种字段 #}
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_onlyload_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 %}