首页 > 解决方案 > 如何在flask sqlalchemy中基于多个模型过滤一个模型?

问题描述

我有三个表,用户、帖子和喜欢。到目前为止,我的喜欢和不喜欢的帖子都在工作,但现在我想返回喜欢特定帖子的用户列表。喜欢将 user_id 和 post_id 作为外键并填充一旦用户喜欢或不喜欢帖子。现在我想过滤所有喜欢特定帖子的用户,但只返回第一个类似用户的帖子,并且三个用户已经喜欢该帖子。

请看下面的代码:

使用型号

class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key = True)
username = db.Column(db.String(64), index = True, unique = True)
email = db.Column(db.String(120), index = True, unique = True)
password_hash = db.Column(db.String(128))
liked = db.relationship(
  'Likes',
  foreign_keys = 'Likes.user_id',
  backref = 'user', lazy = 'dynamic')

def like_post(self, post):
if not self.has_liked_post(post):
like = Likes(user_id = self.id, post_id = post.id)
db.session.add(like)

def unlike_post(self, post):
if self.has_liked_post(post):
  Likes.query.filter_by(
    user_id = self.id,
    post_id = post.id).delete()

def has_liked_post(self, post):
return Likes.query.filter(
  Likes.user_id == self.id,
  Likes.post_id == post.id).count() > 0

后模型

class Meetup(db.Model):
id = db.Column(db.Integer, primary_key = True)
body = db.Column(db.String(120))
timestamp = db.Column(db.DateTime, index = True, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
likes = db.relationship('MeetupLike', backref = 'meetup', lazy = 'dynamic')

喜欢模特

class Likes(db.Model):
id = db.Column(db.Integer, primary_key = True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
post_id = db.Column(db.Integer, db.ForeignKey('post.id'))

路线

@app.route('/applicants/<int:post_id>')
def get_users(post_id):
likes = Likes.query.filter_by(post_id = post_id).first_or_404()
users = User.query.filter(User.id == likes.user_id).all()
return render_template('likes.html', title = "Users", users = users)

模板

<table>
  {% for user in users %}
  <tr valign="top" >
    <td>
    {{ user.firstname }}
   </td>
  < /tr>
 {% endfor %}
</table>

我已经有一个包含三个赞的帖子,并且想要返回所有三个用户详细信息,但只有一个返回。

标签: pythonflasksqlalchemy

解决方案


在这里,您获得的是第一个赞,而不是所有的赞

likes = Likes.query.filter_by(post_id = post_id).first_or_404()

相反,您应该获取所有这些并传递列表:

likes = Likes.query.with_entities(Likes.user_id).filter_by(post_id = post_id).all()
users = User.query.filter(User.id.in_(likes)).all()

您也可以尝试使用 JOIN。


推荐阅读