python - 如何在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>
我已经有一个包含三个赞的帖子,并且想要返回所有三个用户详细信息,但只有一个返回。
解决方案
在这里,您获得的是第一个赞,而不是所有的赞
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。
推荐阅读
- angular - 在 Angular 7 中访问 Trix 配置
- cors - 尝试将 AMP 表单提交到 Azure Logic 应用时出现 CORS 错误
- vue.js - nicolasbeauvais/vue-social-sharing 使用这个包并想要制作动态标题、描述、报价、标签
- dplyr - ifelse 返回意外的值
- python - 如何使用 SWIG 包装 HWND 和 HINSTANCE 类型?
- r - 在 R 中按日期范围对数据进行子集化
- javascript - 正则表达式完全匹配
- machine-learning - 如何使用python反转GP-LVM高斯过程潜在变量并重建原始变量?
- git - 对 gitignore 的异常进行异常处理
- amazon-cloudwatch - 如何在 AWS CloudWatch Insights 中按字段然后按 bin 聚合日志?