我有一个简单的数据结构,其中一个电影表有一个外键到国家表。
为了检索来自同一个国家的所有电影,我拥有“同一个国家的电影”这一属性,这是一种自我参照关系。
它几乎正确地完成了任务,然而,它也将电影本身包含在列表中。我怎么能把它排除在外而只看其他电影呢?
非常感谢!
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import mapper, relationship
metadata = MetaData()
country_table = Table('country', metadata,
Column('id', String, primary_key=True),
Column('name', String),
)
film_table = Table('film', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('year', Integer),
Column('country_id', Integer, ForeignKey('country.id'))
)
class Country(object):
pass
class Film(object):
pass
mapper(Country, country_table)
mapper(Film, film_table,
properties={
'country':relationship(
Country,
backref='films'),
'same_country_films':relationship(
Film,
primaryjoin=film_table.c.country_id==\
film_table.c.country_id,
foreign_keys=[
film_table.c.country_id,
]
)
}
)
最佳答案
最简单的解决方案是自己编写此属性而不是关系:
class Film(object):
@property
def same_country_films(self):
return [f for f in self.country.films if f!=self]
当在会话期间同时访问
film.same_country_films
和country.films
时,此解决方案不会单独查询此属性。财产不能像你通常处理关系那样更新,但我怀疑它是否真的需要。糟糕的是,它是为每个访问进行评估的(没有那么多工作)。您可以将
property
decorator更改为chaching one(类似于werkzeug中的cached_property
),但首次访问该属性后,它将不会反映country.films
中的更改。关于python - sqlalchemy自我引用关系不包括“自我”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5666732/