我正在使用flask-sqlalchemy和sqlite数据库。我试图将所有选票都置于date1
以下sub_query = models.VoteList.query.filter(models.VoteList.vote_datetime < date1)
sub_query = sub_query.filter(models.VoteList.group_id == selected_group.id)
sub_query = sub_query.filter(models.VoteList.user_id == g.user.id)
sub_query = sub_query.subquery()
old_votes = models.Papers.query.join(sub_query, sub_query.c.arxiv_id == models.Papers.arxiv_id).paginate(1, 4, False)
其中VoteList的数据库模型如下所示
class VoteList(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
group_id = db.Column(db.Integer, db.ForeignKey('groups.id'))
arxiv_id = db.Column(db.String(1000), db.ForeignKey('papers.arxiv_id'))
vote_datetime = db.Column(db.DateTime)
group = db.relationship("Groups", backref=db.backref('vote_list', lazy='dynamic'))
user = db.relationship("User", backref=db.backref('votes', lazy='dynamic'), foreign_keys=[user_id])
def __repr__(self):
return '<VoteList %r>' % (self.id)
我确保&#39; old_votes&#39;上面的选择有20个元素。如果我使用.all()而不是.paginate(),我会得到预期的20个结果? 由于我在上面的例子中使用了最大结果值4,我希望old_votes.items有4个元素。但它只有2个?如果我增加最大结果值,元素数量也会增加,但它总是低于最大结果值? Paginate似乎搞砸了什么? 有任何想法吗? 谢谢 卡尔
EDIT 我注意到如果我在add_columns()上应用paginate()函数,它工作正常。因此,如果我添加(没有充分理由)列
old_votes = models.Papers.query.join(sub_query, sub_query.c.arxiv_id == models.Papers.arxiv_id)
old_votes = old_votes.add_columns(sub_query.c.vote_datetime).paginate(page, VOTES_PER_PAGE, False)
它运作正常吗?但既然我不需要那个专栏,那么知道我上面的例子出了什么问题仍然会很有趣吗?
答案 0 :(得分:1)
在我看来,对于查询返回(和过滤)的4行,有4行代表VoteList
表的4个不同行,但它们引用/链接/仅属于2 不同的 Papers
模型。创建模型实例时,会过滤掉重复项,因此您可以获得更少的行。从子查询添加列时,结果是(Papers, vote_datetime)
的元组,在这种情况下,不会删除重复项。
答案 1 :(得分:0)
我遇到了同样的问题,我应用了van的答案,但是没有用。但是,我同意van的解释,因此我在查询中添加了.distinct()
,如下所示:
old_votes = models.Papers.query.distinct().join(sub_query, sub_query.c.arxiv_id == models.Papers.arxiv_id).paginate(1, 4, False)
它按预期工作。