2016-01-03 2 views
0

Я использую колбу-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) 

это прекрасно работает? Но так как мне не нужна эта колонка, мне все же интересно узнать, что пойдет не так с моим примером выше?

ответ

1

кажется мне, что для 4 возвращаемых строк (и фильтрованное) по запросу, существует 4 строки, представляющие 4 различных строк из VoteList таблицы, но они ссылаются/ссылка/принадлежат только 2 различныхPapers моделей. Когда экземпляры модели создаются, дубликаты отфильтровываются, и поэтому вы получаете меньше строк. Когда вы добавляете столбец из подзапроса, результатом являются кортежи (Papers, vote_datetime), и в этом случае дубликаты не удаляются.

+0

yep thats it ... большое спасибо – carl

+0

есть ли способ предотвратить удаление дубликатов? – carl

+0

Я не уверен, какова была бы цель, но я думаю, что если вы запросите 'tuple' вместо экземпляров' model', это сделает трюк. Поэтому вместо 'models.Paper.query ...' (который является (почти) псевдонимом 'session.query (Paper)'), выполняет 'session.query ([Paper]) ...'. Но результатом будут не экземпляры «Бумага», а кортежи с экземплярами «Бумаги». – van

 Смежные вопросы

  • Нет связанных вопросов^_^