gpt4 book ai didi

python - sqlalchemy 自引用关系不包括 'self'

转载 作者:行者123 更新时间:2023-11-28 16:52:15 24 4
gpt4 key购买 nike

我有一个简单的数据结构,其中 film 表有一个指向 country 表的外键。

为了检索来自同一个国家/地区的所有电影,我有这个属性“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,
]
)
}
)

最佳答案

最简单的解决方案是自己编写此属性而不是关系:

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 在 session 生命周期中被访问时,此解决方案不会单独查询此属性。该属性不能像您通常对关系所做的那样进行更新,但我怀疑它是否真的需要。

不好的是它会针对每次访问进行评估(工作量不大)。您可以将 property 装饰器更改为 chaching 装饰器(如 werkzeug 中的 cached_property),但此后该属性将不会反射(reflect) country.films 中的更改首先访问它。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com