0

我有以下代码:

class ArchaeologicalRecord(Base, ObservableMixin, ConcurrentMixin):
    author_id = Column(Integer, ForeignKey('authors.id'))
    author = relationship('Author', backref=backref('record'))

    horizont_id = Column(Integer, ForeignKey('horizonts.id'))
    horizont = relationship('Horizont', backref=backref('record'))

    .....

    somefield_id = Column(Integer, ForeignKey('somefields.id'))
    somefield = relationship('SomeModel', backref=backref('record'))

目前我有一个条目(作者或 Horizo​​nt 或与 arch.record 相关的任何其他条目)。而且我想确保没有任何记录引用该字段。但是我讨厌为每种情况编写大量代码,并且希望以最常见的方式进行。

所以,实际上我有:

  • 考古记录实例
  • 子实体的实例,例如 Horizo​​nt
  • (来自以前的)它是类定义。

如何在不编写大量复制粘贴代码的情况下检查是否ArchaeologicalRecord包含(或不包含)对Horizont(或任何其他子实体)的引用?

4

1 回答 1

1

您是在问如何找到孤儿作者、horzonts、somefields 等?

假设您的所有关系都是多对一的(ArchaelogicalRecord-to-Author),您可以尝试以下操作:

from sqlalchemy.orm.properties import RelationshipProperty
from sqlalchemy.orm import class_mapper

session = ... # However you setup the session

# ArchaelogicalRecord will have various properties defined, 
# some of these are RelationshipProperties, which hold the info you want

for rp in class_mapper(ArchaeologicalRecord).iterate_properties:  
    if not isinstance(rp, RelationshipProperty):
        continue

    query = session.query(rp.mapper.class_)\
            .filter(~getattr(rp.mapper.class_, rp.backref[0]).any())

    orphans = query.all()
    if orphans:
        # Do something...
        print rp.mapper.class_
        print orphans

当 rp.backref 为 None 时,这将失败(即您已经定义了没有 backref 的关系)-在这种情况下,您可能必须更手动地构造查询,但是 RelationshipProperty,它是 .mapper 和 . mapper.class_ 属性应该以通用方式为您提供执行此操作所需的所有信息。

于 2013-09-09T13:33:21.260 回答