Flask-SQLAlchemy, как запросить данные таблиц многие-ко-многим - PullRequest
0 голосов
/ 24 октября 2018

Я использую Flask-SQLalchemy, пытаясь установить отношение «многие ко многим» между двумя таблицами, и вот коды отношений.

port_trades = db.Table(
    'port_trades',
    db.Column('portfolio_id', db.Text, db.ForeignKey('portfolio.portfolio_id'), primary_key=True),
    db.Column('trade_id', db.Text, db.ForeignKey('trade.trade_id'), primary_key=True)
    )

class Portfolio(db.Model):

    __tablename__ = 'portfolio'
    user_id = db.Column(db.Text, primary_key=True)
    portfolio_id = db.Column(db.Text, primary_key=True)
    portfolio_name = db.Column(db.Text)
    trade_id = db.Column(db.Text, primary_key=True)

    trades = db.relationship('Trade', secondary=port_trades,  backref=db.backref('trades', lazy='dynamic'))

    def __repr__(self):
        return '[%r,%r,%r,%r]' % (self.user_id, self.portfolio_id, self.portfolio_name, self.trade_id)

class Trade(db.Model):
    __tablename__ = 'trade'
    trade_id = db.Column(db.Text, primary_key=True)
    user_id = db.Column(db.Text, primary_key=True)
    instrument = db.Column(db.Text)
    trade_type = db.Column(db.Text, primary_key=True)
    product_name = db.Column(db.Text)

    portfolios = db.relationship('Portfolio', secondary=port_trades, backref=db.backref('portfolios', lazy='dynamic'))

    def __repr__(self):
        return '[%r,%r,%r,%r]' % (self.trade_id, self.instrument, self. trade_type, self. product_name)

, как теперь я могу использовать:

port = Portfolio.query.filter_by(portfolio_id=portfolio_id).all()

, чтобы получить порт с определенным аргументом portfolio_id, но как мне получить всю информацию о сделках (все свойства класса Trade) из торговой таблицы.

for example these two tables like this:

-----portfolio_id ----- trade_id
          1                 2
          1                 3 
          1                 4 

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 03 ноября 2018

Изменено несколько строк здесь и там, но не стесняйтесь вернуться к тому, что вы имели.Но не изменяйте часть lazy = "join", так как важно иметь все связанные объекты в объекте запроса.

port_trades = db.Table(
        'port_trades',
        db.Column('portfolio_id', db.Integer(), db.ForeignKey('portfolio.portfolio_id')),
        db.Column('trade_id', db.Integer(), db.ForeignKey('trade.trade_id'))
        )

class Portfolio(db.Model):

    __tablename__ = 'portfolio'
    user_id = db.Column(db.Text, primary_key=True)
    portfolio_id = db.Column(db.Text, primary_key=True)
    portfolio_name = db.Column(db.Text)
    trade_id = db.Column(db.Text, primary_key=True)

    def __repr__(self):
        return '[%r,%r,%r,%r]' % (self.user_id, self.portfolio_id, self.portfolio_name, self.trade_id)

class Trade(db.Model):
    __tablename__ = 'trade'
    trade_id = db.Column(db.Text, primary_key=True)
    user_id = db.Column(db.Text, primary_key=True)
    instrument = db.Column(db.Text)
    trade_type = db.Column(db.Text, primary_key=True)
    product_name = db.Column(db.Text)

    portfolios = db.relationship('Portfolio', secondary=port_trades, backref=db.backref('portfolios', lazy='joined'))

    def __repr__(self):
        return '[%r,%r,%r,%r]' % (self.trade_id, self.instrument, self. trade_type, self. product_name)

Попробуйте использовать приведенный ниже запрос для запроса многих ко многим.Не забудьте поставить «с».

query_port_trades = Trade.query.join(port_trades).join(Portfolio).
filter(port_trades.c.trade_id == Trade.id and port_trades.c.portfolio_id == Portfolio.id).all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...