1

我正在使用带有 flask-restplus 和 sqlalchemy 的烧瓶。

我的 rest API 函数如下所示:

@ns.route('/user')
class UsersCollection(Resource):

    @jwt_optional
    @permissions.user_has('admin_view')
    @ns.marshal_list_with(user_details)
    def get(self):
        """
        Returns list of users.
        """

        users = User.query.all()

        return users

我愿意将额外的数据添加到usersAPI 应该返回的集合中。其中一些数据可能存储在其他数据库表中,而其他数据则存储在内存中。

我通常做的是这样的:

@ns.route('/user')
class UsersCollection(Resource):

    @jwt_optional
    @permissions.user_has('admin_view')
    @ns.marshal_list_with(user_details)
    def get(self):
        """
        Returns list of users.
        """

        users = User.query.all()

        # Add additional data
        for user in users:
          user.activity = UserActivity.query ...  # from DB 
          user.online_status = "Active" # Taken somewhere from memory

        return users

显然,我不喜欢这种将数据动态添加到 User 对象的方法。但是实现它的最佳设计模式是什么?

4

1 回答 1

0

关于设计模式,我推荐 DAO 和服务方法,这里有一篇很好的简短文章: https ://levelup.gitconnected.com/structuring-a-large-production-flask-application-7a0066a65447

关于模型用户/活动关系,我假设您有一个映射的活动模型。如果这是一对一关系,则在 User 模型中为 FK 字段创建一个activityId字段和一个活动关系,当访问user.activity时,您的 ORM(我假设 SQLAlchemy)将在其中检索。

class Activity(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    descrption = db.Column(db.String(255))

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    activity = db.relationship(Activity)
    activityId = db.Column(db.Integer, db.ForeignKey(Activity.id))

如果您有多对多关系,则必须创建第三个名为ActivityUser的类来映射关系

class ActivityUser(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    activity = db.relationship(Activity, lazy=True)
    user = db.relationship(User, lazy=True)
    activityId = db.Column(db.ForeignKey(Activity))
    userId = db.Column(db.ForeignKey(User))

您可以像这样检索用户活动(再次假设您使用 SQLAlchemy):

ActivityUser.query.filter(ActivityUser.userId == user.id).all()
于 2020-08-12T12:02:22.937 回答