Есть ли способ присоединиться к нескольким объектам SQLAlchemy AppenderBaseQuerry? - PullRequest
0 голосов
/ 02 октября 2019

Я работаю с тремя моделями: User, Magazine и Article. Каждый пользователь может подписаться на множество журналов (для которых я использую таблицу подписок). Статьи принадлежат только журналу. Ниже приведены модели, с которыми я работаю:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column( db.String(64) )
    subscriptions= db.relationship('Magazine', secondary=subs, backref=db.backref('subscribers', lazy='dynamic'), lazy='dynamic')


class Magazine(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    articles= db.relationship('Article', backref='magazine', lazy='dynamic')


class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(64))
    abstract = db.Column(db.String(64))
    magazine_id= db.Column(db.Integer, db.ForeignKey('magazine.id'))

subs = db.Table('subs', 
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('magazine_id', db.Integer, db.ForeignKey('magazine.id'))
)

Что мне нужно: дать пользователю возможность получить все статьи из журналов, на которые он подписан. Давайте сделаем тест из оболочки фляги:

biel=User(name='biel')

ng = Magazine(name='National Geographic')
pt=Magazine(name='Physics Today')

ng.subscribers.append(biel)
pt.subscribers.append(biel)

a1=Article(title='title 1, ng')
ng.articles.append(a1)

a2=Article(title='title 2, pt')
pt.articles.append(a2)

a3=Article(title='title 3, pt')
pt.articles.append(a3)

a4=Article(title='title 4, pt')
pt.articles.append(a4)

a5=Article(title='title 5, pt')
pt.articles.append(a5)

a6=Article(title='title 6, pt')
pt.articles.append(a6)

Например, теперь я могу получить все статьи в журнале Physics Today, выполнив:

pt_articles=pt.articles.paginate(1,3,False)

Как я могу аналогичным образом (избазу данных) извлечь все статьи из журналов, на которые подписан пользователь "biel" ?. Я знаю, что могу сделать следующее:

articles=[]
for m in biel.subscriptions:
    articles+=m.articles.all()

, но это не то, чего я хочу, потому что я не могу разбить статьи на страницы или упорядочить их по дате публикации ecc. Мне нужно что-то вроде:

articles=[]
for m in biel.subscriptions:
    articles+=m.articles

articles.paginate(1,3,False)

, но теперь статьи представляют собой список и не могут быть разбиты на страницы.

Большое спасибо заранее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...