sqlalchemy自我参照关系不包括'自我'
问题描述:
我有一个简单的数据结构,其中一个电影表有一个国家表的外键。sqlalchemy自我参照关系不包括'自我'
为了找回所有的都来自同一个国家的电影,我有这样的财产“same_country_films”,一个自我指涉的关系。
它几乎正确地做这项工作,但是,它也包括在列表中的电影本身。我怎么能排除它,只是有其他电影?
非常感谢!
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,
]
)
}
)
答
这应该这样做,我认为,(虽然我还没有实际测试过):
primaryjoin=sqlalchemy.and_(
film_table.c.country_id==film_table.c.country_id,
film_table.c.id!=film_table.c.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
修饰工改为修葺工(如werkzeug中的cached_property
),但在第一次访问后,该属性将不会反映country.films
中的更改。
+0
感谢您的回答。对于所提出的问题,这是一个很好的解决方案说实话,我真正的目的是用这个电影国家的例子来探索关系是如何运作的。是否有可能使用关系来解决问题呢? – Xuan 2011-04-27 23:17:32
不完全。它不替代film_table.c.id?在sql中生成。 – Xuan 2011-04-21 12:21:51