炼金术中如何基于多个模型过滤一个模型?

2024-04-24 01:22:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三张桌子,User,Post,和喜欢。我的喜欢和不喜欢的帖子到目前为止还在运行,但现在我想返回喜欢某个帖子的用户列表。喜欢将用户id和帖子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>

我已经有三个喜欢的职位,并希望返回所有三个用户的详细信息,但只有一个是返回


Tags: 用户selfidtruedbstringcolumninteger
1条回答
网友
1楼 · 发布于 2024-04-24 01:22:51

在这里,你得到的是第一个喜欢,而不是所有喜欢

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

也可以尝试使用连接

相关问题 更多 >