【发布时间】:2020-06-28 19:15:11
【问题描述】:
我有几个 Flask_SQLAlchemy 数据模型及其方法如下:
class User(db.Model):
__table_args__ = {'extend_existing': True}
id = db.Column('id',db.Integer , primary_key=True)
username = db.Column('username', db.String(), unique=False , index=True)
password = db.Column('password' , db.String())
email = db.Column('email',db.String(),unique=True , index=True)
role = db.Column('role', db.Integer(), default=0)
account_state = db.Column('account_state', db.Integer(), default=1)
karma = db.relationship('Karma', backref='user', lazy='dynamic', cascade="all, delete-orphan")
registered_on = db.Column('registered_on' , db.DateTime(timezone=True), server_default=func.now())
followed = db.relationship('Follow',
foreign_keys=[Follow.follower_id], backref=db.backref('follower', lazy='joined'),
lazy='dynamic', cascade='all, delete-orphan')
followers = db.relationship('Follow', foreign_keys=[Follow.followed_id],
backref=db.backref('followed', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan')
def to_dict(self):
data = {
'id': self.id,
'username': self.username,
'is_admin': self.is_admin(),
'followers_count': self.followers_count(),
'followed_count': self.followed_count(),
'has_karma': self.has_karma(),
'karma_count': self.karma_count(),
'registered_on': self.registered_on,
}
return data
def is_admin(self):
if self.role == 1:
return True
return False
def load_karma(self):
karma = self.karma.filter_by(user_id=self.id).first()
return karma
def has_karma(self):
karma = self.load_karma()
if not karma:
return False
if karma:
return True
return False
def karma_count(self):
karma = self.load_karma()
if karma:
return karma.number
return 0
def followers_count(self):
return self.followers.count()
def followed_count(self):
return self.followed.count()
class Karma(db.Model):
__table_args__ = {'extend_existing': True}
id = db.Column(db.Integer, primary_key=True)
number = db.Column(db.Integer)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
last_karma_date = db.Column(db.DateTime, default=datetime.utcnow)
class Follow(db.Model):
__tablename__ = 'follows'
__table_args__ = {'extend_existing': True}
follower_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
followed_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
state = db.Column(db.Integer, default=0)
date_followed = db.Column(db.DateTime, default=datetime.utcnow)
正如您在 User 类中看到的那样,我有几个方法,其中之一是 to_dict(),我用它来为我的 API 端点返回 JSON 数据,但是现在我切换到 Marshmallow 来自动对我的模型进行序列化,我无法理解如何序列化我的用户模型返回的数据,例如 has_karma() 和 karma_count()。我去过stackoverflow上的官方文档和许多在线文章和问题,但还没有。到目前为止,这是我的用户架构:
from marshmallow import Schema, fields, ValidationError
class UserSchema(Schema):
id = fields.Int(dump_only=True)
username = fields.Str()
fullname = fields.Str()
registered_on = fields.DateTime(dump_only=True)
如何像 to_dict() 一样序列化方法返回的数据?
【问题讨论】:
标签: python flask flask-sqlalchemy marshmallow