【发布时间】:2018-04-06 00:13:48
【问题描述】:
我对 SQLAlchemy 还很陌生,我正在尝试弄清楚如何在与关联对象的多对多关系中设置最简单的 order_by。我在这里看到了一些关于按计数排序的问题,但不是这个更基本的问题。
假设这些表(从实际的简化):
class Event(db.Model):
__tablename__ = 'event'
id = db.Column(db.Integer, primary_key=True)
description = db.Column(db.String(255))
date = db.Column(db.Date)
guests = db.relationship('Guest_Event', back_populates='event')
class Guest(db.Model):
__tablename__ = 'guest'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(256))
events = db.relationship('Guest_Event', back_populates='guest')
class Guest_Event(db.Model):
__tablename__ = 'guest_event'
id = db.Column('id', db.Integer, primary_key=True)
guest_id = db.Column('guest_id', db.Integer, db.ForeignKey('guest.id'))
event_id = db.Column('event_id', db.Integer, db.ForeignKey('event.id'))
guest = db.relationship('Guest', back_populates='events')
event = db.relationship('Event', back_populates='guests')
我想做的就是拥有类似的东西:
event = Event.query.get(id)
# Then in a Jinja2 template:
<p>The following people were at this event:</p>
{% for guest_event in event.guests %}
{{ guest_event.guest.name }} <br/>
{% endfor %}
此列表按 guest.name 或类似方式排序
guest = Guest.query.get(id)
# Jinja2:
<p>{{ guest.name }} was at these events:</p>
{% for guest_event in guest.events %}
{{ guest_event.event.date }}: {{ guest_event.event.description }}<br/>
{% endfor %}
这是按 event.date 排序的,可能是降序的。
我尝试将order_by='Guest.name' 放在Guest_Event 类或Event 类中,两者都抛出SQL 错误“Unknown column guest.name in order 子句”,这并不奇怪,因为此查询仅在关联表上运行.但我不知道还能做什么。
最终我想做一个关联代理,因为我只想能够直接执行for guest in event.guests 然后guest.name,而不是打扰关联类。
另外:您将如何动态更改此查询?例如,如果我想按 event.date 在一种情况下升序、在另一种情况下降序或按我在此简化示例中未显示的其他事项对事件进行排序。
【问题讨论】:
-
简而言之,在
Guest_Event关联对象模型中使用guest = db.relationship('Guest', back_populates='events', lazy='joined', order_by='Guest.name')。
标签: python sqlalchemy