Я использую колбу-sqlalchemy вместе с базой данных sqlite. Я стараюсь, чтобы получить все голоса ниже DATE1sqlalchemy: paginate не возвращает ожидаемое количество элементов
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)
Я убедился, что выбор по «old_votes» выше, имеет 20 элементов. Если я использую .all() вместо .paginate(), я получаю ожидаемый результат 20? Так как я использовал максимальное значение результатов 4 в приведенном выше примере, я бы ожидал, что old_votes.items имеет 4 элемента. Но у него всего 2? Если я увеличиваю максимальное значение результата, количество элементов также увеличивается, но оно всегда ниже максимального значения результата? Кажется, что Paginate что-то испортил? любые идеи? благодаря деревенщина
EDIT я заметил, что он работает нормально, если я применяю функцию постраничной() на add_columns(). Поэтому, если я добавлю (без уважительной причины) колонку с
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)
это прекрасно работает? Но так как мне не нужна эта колонка, мне все же интересно узнать, что пойдет не так с моим примером выше?
yep thats it ... большое спасибо – carl
есть ли способ предотвратить удаление дубликатов? – carl
Я не уверен, какова была бы цель, но я думаю, что если вы запросите 'tuple' вместо экземпляров' model', это сделает трюк. Поэтому вместо 'models.Paper.query ...' (который является (почти) псевдонимом 'session.query (Paper)'), выполняет 'session.query ([Paper]) ...'. Но результатом будут не экземпляры «Бумага», а кортежи с экземплярами «Бумаги». – van