【问题标题】:Referencing values using foreign key on flask sql-alchemy在烧瓶 sqlalchemy 中使用外键引用值
【发布时间】:2013-10-16 15:25:38
【问题描述】:

我最近刚开始使用烧瓶和 sql-alchemy 进行 Web 开发。一切正常,直到我不得不使用外键访问值。我有这样的模型:

class User(db.Model):
    _tablename='user'
    id=db.Column(db.Integer, primary_key=True)
    name=db.Column(db.String)
    email=db.Column(db.String)

class Post(db.Model):
    _tablename='post'
    id=db.Column(db.Integer, primary_key=True)
    title=db.Column(db.String)
    user=db.Column(db.Integer, db.ForeignKey('user.id'))

我想在网页上显示所有帖子的列表,在 html 文件中使用类似这样的内容:

{% for entry in entries %}
    <tr>
       <td> {{ entry.id }} </td>
       <td> {{ entry.title }} </td>
       <td> {{ entry.user_name }} </td>
       <td> {{ entry.user_email }} </td>
{% endfor %}

但是,我不确定如何使用 user.id 外键从用户表访问用户和电子邮件。我试过了

posts = Post.query.all()
for post in posts:
    post.user_name = User.query.filter_by(id=post.id).first()
return render_template('post.html', entries=posts)

但是,它不仅返回姓名和电子邮件,如帖子中的标题,而是返回类似 (u'User A',) 和 (u'test@test.com',) 之类的内容。而且我想不出其他办法。谁能帮帮我?

【问题讨论】:

    标签: python sqlite flask foreign-key-relationship flask-sqlalchemy


    【解决方案1】:

    你几乎在那里,但下面的代码实际上并没有返回用户名。它返回整个用户对象:

    User.query.filter_by(id=post.id).first() # Does Not return user_name but returns the user object
    

    所以我会这样称呼它:

    userobj = User.query.filter_by(id=post.id).first()
    

    然后您可以检索用户名,电子邮件为:

    if userobj is not None: # Make sure user exists
        username = userobj.name
        email = userobj.email
    

    作为捷径,你也可以这样做:

    username = User.query.filter_by(id=post.id).first().name
    email = User.query.filter_by(id=post.id).first().email
    

    【讨论】:

      【解决方案2】:

      首先解决方法是使用相关字段进行查询。 您可以使用以下查询获取用户详细信息: 假设用户模型中的 id 为 1,后模型中的用户值为 1,即(id=1,用户=1)。

      链接帖子模型和用户模型 您将它们与相关字段链接,即 (用户模型有 id 而 Post 模型有用户作为外键)

      import Post #import post 模型

      user = User.query.filter(User.id==Post.user).first()
      

      下面将给出用户创建的帖子模型中的第一个帖子

      导入用户#导入用户模型

      post = Post.query.filter(Post.user==User.id).first()
      
      post.id
      post.title
      user.name
      user.email
      

      您也可以查询获取如下所有帖子

      posts = Post.query.filter(Post.user==User.id).all()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-06
        • 2016-01-15
        • 2015-12-14
        • 1970-01-01
        • 2017-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多