如何从关系表中查询数据并以json格式显示它们[重复]

Posted

技术标签:

【中文标题】如何从关系表中查询数据并以json格式显示它们[重复]【英文标题】:How to query data from relations tables and show them in json format [duplicate] 【发布时间】:2022-01-07 04:36:24 【问题描述】:

我有教练的数据类和用户的数据类。如何用json格式里面的用户列表查询所有coach结果。 所以例如我想实现这个:""coach_id":1,"coach_login":"Alan","subscribers":[ "user_id":1,"user_login":"John"]"


@dataclass
class User(db.Model):
    __tablename__='user'
    user_id: int
    login: str
    user_id = db.Column(db.BigInteger, primary_key=True)
    login = db.Column(db.String(255))
    password_hash = db.Column(db.String(255))
    subscriptions = db.relationship('Coach', secondary=subs, backref='subscribers')

    @property
    def password(self):
        raise AttributeError('Password is not in valid format')

    @password.setter
    def password(self,password):
        self.password_hash = generate_password_hash(password)
    def varify_password(self, password):
        return check_password_hash(self.password_hash,password)
@dataclass
class Coach(db.Model):
    __tablename__='coach'
    coach_id: int
    login: str
    coach_id = db.Column(db.BigInteger, primary_key=True)
    login = db.Column(db.String(255))
    password_hash = db.Column(db.String(255))

    @property
    def password(self):
        raise AttributeError('Password is not in valid format')

    @password.setter
    def password(self,password):
        self.password_hash = generate_password_hash(password)
    def varify_password(self, password):
        return check_password_hash(self.password_hash,password)

【问题讨论】:

【参考方案1】:

借助 dataclass 装饰器,您可以使用 SqlAlchemy 获取数据,然后将其解析为 JSON:

# Endpoint to get a list of all users
@app.route("/api/users/", methods=['GET'])
def users():
    users = User.query.all()
    return jsonify(users)

【讨论】:

是的,我知道并且我现在正在使用它,但我想要实现的是:我创建了 2 个数据模型(用户和教练)。这是多对多的关系。现在我尝试显示教练数据,这些数据将包含分配给该教练的用户列表。当我查询 Coach.query.all() 时,它只会显示教练数据(例如 id、登录名),但不会显示分配给该教练的用户列表。如何查询数据来实现呢? (json格式结果)【参考方案2】:

您可以使用棉花糖 (https://marshmallow.readthedocs.io/)

烧瓶棉花糖:https://flask-marshmallow.readthedocs.io/en/latest/

marshmallow 是一个与 ORM/ODM/框架无关的库,用于转换 与本机 Python 之间的复杂数据类型,例如对象 数据类型。

您可以像 SQLAlchemy 一样初始化 Marshmallow(您可以在文档中找到很好的示例)

然后您可以使用 ma.SQLAlchemyAutoSchema 为您的表创建架构(对于关系:https://marshmallow.readthedocs.io/en/stable/nesting.html

class UserSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model= User
        sqla_session = db.session

然后你可以在 UserSchema 中加载一个 User 并转储它

user = User.query.first()
user_schema = UserSchema()
user_schema.dump(user)

【讨论】:

我也用过棉花糖。但是我仍然没有收到我想要的结果。我有 2 个数据模型(用户和教练)。这是多对多的关系。现在我尝试显示教练数据,这些数据将包含分配给该教练的用户列表。当我使用棉花糖模式并转储结果时,它只会显示教练数据(例如 id、登录名),但不会显示分配给该教练的用户列表。如何查询数据来实现呢? (json格式结果)

以上是关于如何从关系表中查询数据并以json格式显示它们[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从数据库中检索数据并在 json laravel 4 中打印它们

MySQL/PHP 输出数组重复查询然后显示结果,如何删除查询? [复制]

如何通过 query() 获取 wordpress 帖子并以 json 格式输出?

怎么提取mysql数据库表中的内容,并以表格形式显示在页面上。

如何使用 Django 查询从一对多关系中获取数据

查询 DB 并以 Json 格式返回结果的通用 Java 方法