Шаблоны проектирования для реализации API фляги

Я использую колбу с колбой-restplus и sqlalchemy.

Моя функция 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

Я готов добавить дополнительные данные в users коллекция, которая должна быть возвращена 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()

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

        return users

Очевидно, мне не нравится такой подход добавления данных к объекту User на лету. Но каков наилучший шаблон дизайна для его достижения?

0 ответов

Что касается шаблона проектирования, я рекомендую подход DAO и Service, вот хорошая и короткая статья об этом: https://levelup.gitconnected.com/structuring-a-large-production-flask-application-7a0066a65447

Что касается модели отношения "Пользователь / активность", я полагаю, что у вас есть сопоставленная модель активности. Если это отношение "один к одному", в модели User создайте поле activityId для поля FK и отношение активности, из которого ORM (я предполагаю, что SQLAlchemy) будет извлекаться при обращении к user.activity.

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()
Другие вопросы по тегам