Странное поведение при разбивке на страницы подзапроса в колбе - PullRequest
0 голосов
/ 08 октября 2019

Я работаю в проекте фляги (мой самый первый проект в фляге), и у меня возникла проблема при попытке разбить на страницы запрос, содержащий подзапрос. Просто чтобы представить вас на картинке, у меня есть три модели: 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

Этот фрагмент кода отлично работает, если я меняю подписчиков для какого-то другого запроса, который не использует подзапрос. Чего мне не хватает? !!

большое спасибо

...