管理包含元素的索引/位置信息的自定义列表。
作者: | Jason Kirtland |
---|
orderinglist
is a helper for mutable ordered relationships. 它将拦截在relationship()
管理的集合上执行的列表操作,并自动将列表位置中的更改同步到目标标量属性上。
示例:一个slide
表,其中每一行引用相关bullet
表中的零个或多个条目。幻灯片中的项目符号将根据bullet
表中的position
列的值依次显示。当条目在内存中重新排序时,position
属性的值应该更新以反映新的排序顺序:
Base = declarative_base()
class Slide(Base):
__tablename__ = 'slide'
id = Column(Integer, primary_key=True)
name = Column(String)
bullets = relationship("Bullet", order_by="Bullet.position")
class Bullet(Base):
__tablename__ = 'bullet'
id = Column(Integer, primary_key=True)
slide_id = Column(Integer, ForeignKey('slide.id'))
position = Column(Integer)
text = Column(String)
标准关系映射将在包含所有相关的Bullet
对象的每个Slide
上产生一个类似列表的属性,但不会自动处理排序中的更改。当将Bullet
附加到Slide.bullets
时,Bullet.position
属性将保持未设置状态,直到手动分配。当Bullet
插入列表中间时,以下Bullet
对象也需要重新编号。
OrderingList
对象自动执行此任务,管理集合中所有Bullet
对象上的position
属性。它是使用ordering_list()
工厂构造的:
from sqlalchemy.ext.orderinglist import ordering_list
Base = declarative_base()
class Slide(Base):
__tablename__ = 'slide'
id = Column(Integer, primary_key=True)
name = Column(String)
bullets = relationship("Bullet", order_by="Bullet.position",
collection_class=ordering_list('position'))
class Bullet(Base):
__tablename__ = 'bullet'
id = Column(Integer, primary_key=True)
slide_id = Column(Integer, ForeignKey('slide.id'))
position = Column(Integer)
text = Column(String)
通过上面的映射,管理Bullet.position
属性:
s = Slide()
s.bullets.append(Bullet())
s.bullets.append(Bullet())
s.bullets[1].position
>>> 1
s.bullets.insert(1, Bullet())
s.bullets[2].position
>>> 2
OrderingList
构造仅适用于集合中的更改,而不是数据库中的初始加载,并且要求列表在加载时排序。因此,请务必在relationship()
上针对目标排序属性指定order_by
,以便在首次加载时排序正确。
警告
OrderingList
only provides limited functionality when a primary key column or unique column is the target of the sort. 不支持或存在问题的操作包括:
- 两个条目必须交换价值。这在主键或唯一约束的情况下不直接支持,因为这意味着至少需要先暂时删除一行,或者在交换机发生时将其更改为第三个中性值。
- 必须删除一个条目才能为新条目腾出空间。SQLAlchemy的工作单元在单次刷新内的DELETE之前执行所有INSERT。在主键的情况下,它将交易UPDATE语句的同一主键的INSERT / DELETE,以减少此限制的影响,但这不会发生在UNIQUE列上。未来的功能将允许“DELETE before INSERT”行为成为可能,以缓解这一限制,虽然此功能要求在映射器级别对要以这种方式处理的列组进行显式配置。
ordering_list()
takes the name of the related object’s ordering attribute as an argument. 默认情况下,ordering_list()
中对象位置的从零开始的整数索引与排序属性同步:索引0将获得位置0,索引1位置1等。要开始以1或其他整数进行编号,请提供count_from=1
。
sqlalchemy.ext.orderinglist.
ordering_list
(attr, count_from=None, **kw)¶准备一个用于映射器定义的OrderingList
工厂。
返回适合用作Mapper关系的collection_class
选项参数的对象。例如。:
from sqlalchemy.ext.orderinglist import ordering_list
class Slide(Base):
__tablename__ = 'slide'
id = Column(Integer, primary_key=True)
name = Column(String)
bullets = relationship("Bullet", order_by="Bullet.position",
collection_class=ordering_list('position'))
参数: |
---|
其他参数传递给OrderingList
构造函数。
sqlalchemy.ext.orderinglist。
count_from_0
( index,collection ) T5> ¶ T6>编号功能:从0开始的连续整数。
sqlalchemy.ext.orderinglist。
count_from_1
( index,collection ) T5> ¶ T6>编号功能:从1开始的连续整数。
sqlalchemy.ext.orderinglist。 T0> count_from_n_factory T1> ( T2> 启动 T3> ) T4> ¶< / T5>
编号功能:从任意启动开始的连续整数。
sqlalchemy.ext.orderinglist.
OrderingList
(ordering_attr=None, ordering_func=None, reorder_on_append=False)¶基础:__builtin__.list
管理其子女的位置信息的自定义列表。
OrderingList
对象通常使用ordering_list()
工厂函数设置,与relationship()
函数结合使用。
__ init __
( ordering_attr = None,ordering_func = None,reorder_on_append = False ) T5> ¶ T6>管理其子女的位置信息的自定义列表。
OrderingList
is a collection_class
list implementation that syncs position in a Python list with a position attribute on the mapped objects.
这个实现依赖于以正确的顺序开始的列表,所以确定在你的关系上放置一个order_by
。
参数: |
|
---|
追加 T0> ( T1> 实体 T2> ) T3> ¶ T4>
L.append(object) - 追加对象结束
插入
( 索引,实体 ) ¶L.insert(index,object) - 在索引之前插入对象
pop
([index]) → item -- remove and return item at index (default last).¶如果列表为空或索引超出范围,则引发IndexError。
除去 T0> ( T1> 实体 T2> ) T3> ¶ T4>
L.remove(价值) - 删除第一次出现的价值。如果值不存在,则引发ValueError。
重排序 T0> ( T1> ) T2> ¶ T3>
同步整个集合的排序。
扫描列表并确保每个对象都有准确的订购信息集。