【发布时间】:2013-10-28 12:54:15
【问题描述】:
我在 SQLAlchemy 中有一个关联对象,其中包含其他 2 个对象的一些额外信息(实际上是一个字段)。
第一个对象是Photo 模型,第二个对象是PhotoSet,关联对象称为PhotoInSet,它包含position 属性,它告诉我们Photo 在当前PhotoSet。
class Photo(Base):
__tablename__ = 'photos'
id = Column(Integer, primary_key=True)
filename = Column(String(128), index=True)
title = Column(String(256))
description = Column(Text)
pub_date = Column(SADateTime)
class PhotoInSet(Base):
__tablename__ = 'set_order'
photo_id = Column(Integer, ForeignKey('photos.id'), primary_key=True)
photoset_id = Column(Integer, ForeignKey('photo_set.id'), primary_key=True)
position = Column(Integer)
photo = relationship('Photo', backref='sets')
def __repr__(self):
return '<PhotoInSet %r>' % self.position
class PhotoSet(Base):
__tablename__ = 'photo_set'
id = Column(Integer, primary_key=True)
name = Column(String(256))
description = Column(Text)
timestamp = Column(SADateTime)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship('User', backref=backref('sets', lazy='dynamic'))
photo_id = Column(Integer, ForeignKey('photos.id'))
photos = relationship('PhotoInSet', backref=backref('set', lazy='select'))
创建一个新的PhotoSet 保存position 并创建关系没有问题,这(大致)是这样完成的:
# Create the Set
new_set = PhotoSet(name, user)
# Add the photos with positions applied in the order they came
new_set.photos.extend(
[
PhotoInSet(position=pos, photo=photo)
for pos, photo in
enumerate(photo_selection)
]
)
但是我在尝试弄清楚如何在订单更改时更新position 时遇到了很多麻烦。
如果我有 3 个Photo 对象,ID 分别为 1、2 和 3,位置分别为 1、2 和 3,创建后将如下所示:
>>> _set = PhotoSet.get(1)
>>> _set.photos
[<PhotoInSet 1>, <PhotoInSet 2>, <PhotoInSet 3>]
如果顺序发生变化,(让我们颠倒这个例子的顺序),SQLAlchemy 是否可以帮助我更新position 值?到目前为止,我对我能想出的任何方法都不满意。
最简洁的方法是什么?
【问题讨论】:
标签: python sqlalchemy many-to-many