Я работаю в проекте фляги (мой самый первый проект в фляге), и у меня возникла проблема при попытке разбить на страницы запрос, содержащий подзапрос. Просто чтобы представить вас на картинке, у меня есть три модели: User, Magazine и Article. Каждый пользователь подписан на несколько журналов, каждая статья принадлежит журналу. Я использую запросы и разбиваю на страницы результаты в нескольких частях кода без каких-либо проблем, кроме случаев, когда я использую подзапрос. Ниже приведен код, из которого я извлекаю всех пользователей, подписанных на журналы, на которые подписан конкретный пользователь (с идентификатором == 2):
sub = db.session.query(Magazine).join(Magazine.subscribers).filter(User.id == 2).subquery()
subscribers = db.session.query(User).select_from(sub).join(Magazine.subscribers)
, этот код работает хорошо, и в подписчиках. пользователи, которые там должны быть. Я создал макет, где 5 пользователей подписались на журнал, на который также подписан текущий пользователь. Поэтому следующий код
print(len(subscribers.all()), ' friends:')
for s in subscribers.all(): print(s.name)
выводит «5 друзей» и их имена правильно. Однако проблема возникает, когда я пытаюсь разбить подписчиков на страницы:
page=request.args.get('page', 1, type=int)
friends=subscribers.paginate(page, 3, False)
print('len(friends.items) ', len(friends.items))
for f in friends.items: print(f.name)
Для начала я прошу 3 элемента, а len (friends.items) равен 2. Я попытался запросить различное количество результатови это всегда возвращает на единицу меньше. Во-вторых, friends.has_next имеет значение False, когда оно должно быть True: в подписчике есть 5 элементов, а я только попросил 3. Для ясности позвольте мне поместить код с некоторыми операторами печати и выводить его:
from app import app, db
from app.models import *
from flask import render_template, url_for, request
@app.route('/')
@app.route('/index')
def index():
page=request.args.get('page', 1, type=int)
print('page: ', page)
sub = db.session.query(Magazine).join(Magazine.subscribers).filter(User.id == 2).subquery()
subscribers = db.session.query(User).select_from(sub).join(Magazine.subscribers)
print(len(subscribers.all()), ' friends:')
for s in subscribers.all(): print(s.name)
friends=subscribers.paginate(page, 3, False)
print('len(friends.items) ', len(friends.items))
for f in friends.items: print(f.name)
print('has_next: ', friends.has_next, ' has_previous ', friends. has_prev)
print('next_num: ', friends.next_num, ' prev_num: ', friends.prev_num)
next_url=url_for('index', page=friends.next_num) if friends.has_next else None
prev_url=url_for('index', page=friends.prev_num) if friends.has_prev else None
print(next_url)
print(prev_url)
return render_template("index.html", title="My friends", friends=friends.items, next_url=next_url, prev_url=prev_url)
И вывод на оболочке:
page: 1
5 friends:
biel
lluna
bruno
llucia
moix
len(friends.items) 2
biel
lluna
has_next: False has_previous False
next_num: None prev_num: None
None
None
Этот фрагмент кода отлично работает, если я меняю подписчиков для какого-то другого запроса, который не использует подзапрос. Чего мне не хватает? !!
большое спасибо