SQLAlchemy Упорядочить объединенную таблицу по полю в другой объединенной таблице - PullRequest
0 голосов
/ 20 октября 2019

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

У меня есть 3таблицы с объединением 1> 1 в таблицах 1 и 2 и объединением много> многих в таблицах 2 и 3, определенных в таблице 4 следующим образом:

class Order(db.Model):  
    id = db.Column(db.Integer, primary_key=True)
    eta = db.Column(db.DateTime())
    order_lines = db.relationship('Line', backref='order', order_by=lambda: Line.id)
    def __repr__(self):
        return '<Order No. {}>'.format(self.increment_id)

class Line(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    line_name = db.Column(db.String())
    order_id = db.Column(db.Integer, db.ForeignKey('order.id'))
    product_id = db.Column(db.String, db.ForeignKey('product.product_id'))
    def __repr__(self):
        return '<Line SKU: {}>'.format(self.line_sku)

class Line_view(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    view_name = db.Column(db.String())
    view_lines  = relationship('Line', 
        secondary='line_view_join', 
        backref='views',
        lazy='dynamic',
        order_by= ***???*** ) #ordery by eta on Order table
    def __repr__(self):
        return '<View: {}>'.format(self.view_name)

class Line_view_join(db.Model):
    __tablename__ = 'line_view_join'
    id = db.Column(db.Integer(), primary_key=True)
    line_id = db.Column(db.Integer(), db.ForeignKey('line.id', ondelete='CASCADE'))
    view_id = db.Column(db.Integer(), db.ForeignKey('line_view.id', ondelete='CASCADE'))

Я пытаюсь понять, как запросить таблицу 3, Line_Viewи иметь объединенные строки, упорядоченные по таблице заказа.

, чтобы при запросе:

chosen_view = Line_view.query.filter_by(id = 1).one()

chosen_view.view_lines упорядочивалось по Order.eta

У меня естьПробовал

class Line_view(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    view_name = db.Column(db.String())
    view_lines  = relationship('Line', 
        secondary='line_view_join', 
        backref='views',
        lazy='dynamic',
        **order_by=lambda: asc(Line.order.eta))**
    def __repr__(self):
        return '<View: {}>'.format(self.view_name)

Но это приводит к ошибке:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Line.order has an attribute 'eta'

1 Ответ

0 голосов
/ 24 октября 2019

Нужно ли хранить Line_views в базе данных? Если нет, вы можете запросить строки, отсортированные по атрибуту eta соответствующего заказа. Ниже я создаю два заказа по одной строке каждый, а затем запрашиваю строки, отсортированные по атрибуту eta их заказа:

eta = datetime(2019,10,10)
o = Order(eta = eta)
l = Line(order=o, line_name="sample")
db.session.add(o)
db.session.add(l)

eta = datetime(2019,11,11)
o1 = Order(eta = eta)
l1 = Line(order=o1, line_name="sample1")
db.session.add(o1)
db.session.add(l1)
db.session.commit()

lines = Line.query.join(Order).order_by(Order.eta)
...