sqlite 在flask sql-alchemy上使用外键引用值

5anewei6  于 2022-11-24  发布在  SQLite
关注(0)|答案(3)|浏览(171)

我有这样的模型:

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 %}

但是,我不知道如何使用www.example.com外键从用户表访问用户和电子邮件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)

但是,它不是像post中的title那样只返回名称和电子邮件,而是返回类似于(u'User A',)和(u'test@test.com',)的内容。

ff29svar

ff29svar1#

您几乎已经做到了,但下面的代码实际上并没有返回用户名,而是返回了整个用户对象:

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
2guxujil

2guxujil2#

首先,解决方案是使用相关字段进行查询。您可以使用以下查询获取用户详细信息:让我们假设用户模型中的id是1,并且post模型中的user值是1,即(id=1,user=1)。
将post模型与user模型链接您需要将它们与相关字段链接起来,例如(User model has id and Post model has user as a foreign key)
import Post #导入帖子模型

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

下面将给予用户创建的帖子模型中的第一个帖子
import用户#导入用户模型

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()
3zwtqj6y

3zwtqj6y3#

其他答案要求您创建第二个查询以获取用户名和电子邮件,但如果您将以下内容添加到User类定义中,则实际上并不需要这样做:
posts=db.relationship('Post', backref='post_owner',lazy=True)
完整的User类定义将为:

class User(db.Model):
    _tablename='user'
    id=db.Column(db.Integer, primary_key=True)
    name=db.Column(db.String)
    email=db.Column(db.String)
    posts=db.relationship('Post', backref='post_owner', lazy=True)

然后,您的html可以通过引用"backref"名称来利用该关系:

{% for entry in entries %}
    <tr>
       <td> {{ entry.id }} </td>
       <td> {{ entry.title }} </td>
       <td> {{ entry.post_owner.name }} </td>
       <td> {{ entry.post_owner.email }} </td>

{% endfor %}

这使您不必编写额外的查询,也不必使用额外的"if"语句来使代码变得混乱。

相关问题