嵌套的 Marshmallow 和 Sqlalchemy 包括子项
Nested Marshmallow and Sqlalchemy include children
我有一个与 2 table 相关的枢轴 (postgres)table。使用 flask-marshmallow 和 sqlalchemy 我想从他们的任何棉花糖模式中的 tables 中获取数据。例如:Table1Schema().dump(table1_object).first:并获取与 Table2 数据内部连接的 Table1 记录(Many=True):
以下是我当前的代码:
仅供参考:我是 Flask 和 ORM 世界的新手:
我的模特:
class Permission(db.Model):
__tablename__ = 'permission'
permission_id = db.Column(db.Integer, primary_key=True)
object = db.Column(db.String(70), nullable=False)
def __init__(self, object):
self.object = object
class Role(db.Model):
__tablename__ = 'role'
role_id = db.Column(db.Integer, primary_key = True)
role_name = db.Column(db.String(70), nullable=False)
role_permissions = db.relationship("RolePermission",backref='Role', lazy='dynamic')
def __init__(self,role_name):
self.role_name = role_name
class RolePermission(db.Model):
__tablename__ = 'role_permission'
role_permission_id = db.Column(db.Integer, primary_key=True)
role_id = db.Column(db.Integer, db.ForeignKey('role.role_id', ondelete='CASCADE'), nullable =False)
permission_id = db.Column(db.Integer, db.ForeignKey('permission.permission_id', ondelete='CASCADE'), nullable =False)
def __init__(self,role_id,permission_id):
self.role_id = role_id
self.permission_id = permission_id
还有我的模式:
class RoleSchema(ma.Schema):
role_id = fields.Integer(dump_only=True)
role_name = fields.String(required=True, validate=validate.Length(1))
permissions = fields.Nested('RolePermissionSchema', many=True, only=('permission',))
class Meta:
model = Role
fields = ('role_id', 'role_name', 'permissions')
class RolePermissionSchema(ma.Schema):
role_permission_id = fields.Integer(dump_only=True)
role_id = fields.Integer(required=True)
permission_id = fields.Integer(required=True)
role = fields.Nested('ROleSchema', many=False, only=('role_id', 'role_name',))
permission = fields.Nested('PermissionSchema', many=False, only=('object', 'action',))
class PermissionSchema(ma.Schema):
permission_id = fields.Integer(dump_only=True)
object = fields.String(required=True, validate=validate.Length(1))
role_permissions = fields.Nested('RolePermissionSchema', many=True, only=('role_permission_id', 'role_id',))
class Meta:
fields = ('object','action','role_permissions',)
序列化器:
role = Role.query.filter_by(role_name=data['role_name']).filter_by(status=data['status']).first()
role_schema.dump(role).data
我想打印一个具有权限[]对象的角色o对象。
然而从上面我能得到的只是角色内容。
以下是输出:
{
"role_name": "user",
"status": true,
"role_id": 4
}
我怎样才能得到这样的东西:
{
"role_name": "user",
"status": true,
"role_id": 4,
"permissions":[{
"object":"user",
"action":"create"},
]
}
这里有一些命名问题,由注释行 #
指出。
class Role(db.Model):
__tablename__ = 'role'
role_id = db.Column(db.Integer, primary_key = True)
role_name = db.Column(db.String(70), nullable=False)
# This backref should probably be named role
role_permissions = db.relationship("RolePermission",backref='Role', lazy='dynamic')
class RoleSchema(ma.Schema):
role_id = fields.Integer(dump_only=True)
role_name = fields.String(required=True, validate=validate.Length(1))
# This does not correspond to role_permissions in class Role
permissions = fields.Nested('RolePermissionSchema', many=True, only=('permission',))
class Meta:
model = Role
fields = ('role_id', 'role_name', 'permissions')
class RolePermissionSchema(ma.Schema):
role_permission_id = fields.Integer(dump_only=True)
role_id = fields.Integer(required=True)
permission_id = fields.Integer(required=True)
# Should be RoleSchema
role = fields.Nested('ROleSchema', many=False, only=('role_id', 'role_name',))
permission = fields.Nested('PermissionSchema', many=False, only=('object', 'action',))
我有一个与 2 table 相关的枢轴 (postgres)table。使用 flask-marshmallow 和 sqlalchemy 我想从他们的任何棉花糖模式中的 tables 中获取数据。例如:Table1Schema().dump(table1_object).first:并获取与 Table2 数据内部连接的 Table1 记录(Many=True): 以下是我当前的代码:
仅供参考:我是 Flask 和 ORM 世界的新手:
我的模特:
class Permission(db.Model):
__tablename__ = 'permission'
permission_id = db.Column(db.Integer, primary_key=True)
object = db.Column(db.String(70), nullable=False)
def __init__(self, object):
self.object = object
class Role(db.Model):
__tablename__ = 'role'
role_id = db.Column(db.Integer, primary_key = True)
role_name = db.Column(db.String(70), nullable=False)
role_permissions = db.relationship("RolePermission",backref='Role', lazy='dynamic')
def __init__(self,role_name):
self.role_name = role_name
class RolePermission(db.Model):
__tablename__ = 'role_permission'
role_permission_id = db.Column(db.Integer, primary_key=True)
role_id = db.Column(db.Integer, db.ForeignKey('role.role_id', ondelete='CASCADE'), nullable =False)
permission_id = db.Column(db.Integer, db.ForeignKey('permission.permission_id', ondelete='CASCADE'), nullable =False)
def __init__(self,role_id,permission_id):
self.role_id = role_id
self.permission_id = permission_id
还有我的模式:
class RoleSchema(ma.Schema):
role_id = fields.Integer(dump_only=True)
role_name = fields.String(required=True, validate=validate.Length(1))
permissions = fields.Nested('RolePermissionSchema', many=True, only=('permission',))
class Meta:
model = Role
fields = ('role_id', 'role_name', 'permissions')
class RolePermissionSchema(ma.Schema):
role_permission_id = fields.Integer(dump_only=True)
role_id = fields.Integer(required=True)
permission_id = fields.Integer(required=True)
role = fields.Nested('ROleSchema', many=False, only=('role_id', 'role_name',))
permission = fields.Nested('PermissionSchema', many=False, only=('object', 'action',))
class PermissionSchema(ma.Schema):
permission_id = fields.Integer(dump_only=True)
object = fields.String(required=True, validate=validate.Length(1))
role_permissions = fields.Nested('RolePermissionSchema', many=True, only=('role_permission_id', 'role_id',))
class Meta:
fields = ('object','action','role_permissions',)
序列化器:
role = Role.query.filter_by(role_name=data['role_name']).filter_by(status=data['status']).first()
role_schema.dump(role).data
我想打印一个具有权限[]对象的角色o对象。 然而从上面我能得到的只是角色内容。 以下是输出:
{
"role_name": "user",
"status": true,
"role_id": 4
}
我怎样才能得到这样的东西:
{
"role_name": "user",
"status": true,
"role_id": 4,
"permissions":[{
"object":"user",
"action":"create"},
]
}
这里有一些命名问题,由注释行 #
指出。
class Role(db.Model):
__tablename__ = 'role'
role_id = db.Column(db.Integer, primary_key = True)
role_name = db.Column(db.String(70), nullable=False)
# This backref should probably be named role
role_permissions = db.relationship("RolePermission",backref='Role', lazy='dynamic')
class RoleSchema(ma.Schema):
role_id = fields.Integer(dump_only=True)
role_name = fields.String(required=True, validate=validate.Length(1))
# This does not correspond to role_permissions in class Role
permissions = fields.Nested('RolePermissionSchema', many=True, only=('permission',))
class Meta:
model = Role
fields = ('role_id', 'role_name', 'permissions')
class RolePermissionSchema(ma.Schema):
role_permission_id = fields.Integer(dump_only=True)
role_id = fields.Integer(required=True)
permission_id = fields.Integer(required=True)
# Should be RoleSchema
role = fields.Nested('ROleSchema', many=False, only=('role_id', 'role_name',))
permission = fields.Nested('PermissionSchema', many=False, only=('object', 'action',))