sqlalchemy自我参照关系不包括'自我'

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) 
+0

不完全。它不替代film_table.c.id?在sql中生成。 – Xuan 2011-04-21 12:21:51

最简单的办法就是自己这个财产关系,而不是代码:

class Film(object): 
    @property 
    def same_country_films(self): 
     return [f for f in self.country.films if f!=self] 

当在会话生命期间访问film.same_country_filmscountry.films时,此解决方案将不会对此属性进行单独查询。该属性不能更新,因为你可以用通常的方式处理关系,但我怀疑它是真正需要的。

坏的是,它的每个访问(没有这么多的工作)进行评估。您可以将property修饰工改为修葺工(如werkzeug中的cached_property),但在第一次访问后,该属性将不会反映country.films中的更改。

+0

感谢您的回答。对于所提出的问题,这是一个很好的解决方案说实话,我真正的目的是用这个电影国家的例子来探索关系是如何运作的。是否有可能使用关系来解决问题呢? – Xuan 2011-04-27 23:17:32