我有一个简单的数据结构,其中一个电影表有一个外键到国家表。
为了检索来自同一个国家的所有电影,我拥有“同一个国家的电影”这一属性,这是一种自我参照关系。
它几乎正确地完成了任务,然而,它也将电影本身包含在列表中。我怎么能把它排除在外而只看其他电影呢?
非常感谢!

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_filmscountry.films时,此解决方案不会单独查询此属性。财产不能像你通常处理关系那样更新,但我怀疑它是否真的需要。
糟糕的是,它是为每个访问进行评估的(没有那么多工作)。您可以将propertydecorator更改为chaching one(类似于werkzeug中的cached_property),但首次访问该属性后,它将不会反映country.films中的更改。

关于python - sqlalchemy自我引用关系不包括“自我”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5666732/

10-09 19:53