gpt4 book ai didi

python - Flask 帮助理解多对多关系上的 primaryjoin/secondaryjoin

转载 作者:行者123 更新时间:2023-11-28 16:38:54 26 4
gpt4 key购买 nike

我有 User 和 Listing 类,我正在尝试创建多对多关系,以便用户可以拥有许多最喜欢的列表,并且任何列表都可以被许多用户收藏。

我一直在使用 this作为引用,但这是我的第一个多对多关系,因此我们将不胜感激。

InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: Could not determine relationship direction for primaryjoin condition 'favorites_table.user_id = :user_id_1', on relationship User.favorites. Ensure that the referencing Column objects have a ForeignKey present, or are otherwise part of a ForeignKeyConstraint on their parent Table, or specify the foreign_keys parameter to this relationship.

模型.py

favorites_table = db.Table('favorites_table',
db.Column('user_id', db.Integer, db.ForeignKey('listing.id')),
db.Column('listing_id', db.Integer, db.ForeignKey('user.id'))
)

class User(db.Model):
id = db.Column(db.Integer, primary_key = True)
listings = db.relationship('Listing', backref = 'manager', lazy = 'dynamic')
favorites = db.relationship('Listing',
secondary=favorites_table,
primaryjoin = ('favorites_table.c.user_id == id'),
secondaryjoin = ('favorites_table.c.listing_id == id'),
backref = db.backref('user', lazy = 'dynamic'),
lazy = 'dynamic')

def favorite_listing(self, listing):
if not self.is_favorite(listing):
self.favorites.append(listing)
return self

def unfavorite_listing(self, listing):
if self.is_favorite(listing):
self.favorites.remove(listing)
return self

def is_favorite(self, listing):
return self.favorites.filter(favorites_table.c.listing_id == listing.id).count() > 0


class Listing(db.Model):
id = db.Column(db.Integer, primary_key = True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

最佳答案

由于您的模型已指定所有必需的 ForeignKey,sqlachemy 足够聪明,可以自行计算出 primaryjoinsecondaryjoin 的参数。所以这应该可以正常工作:

favorites  = db.relationship('Listing',
secondary = favorites_table,
# primaryjoin = 'favorites_table.c.user_id == User.id',
# secondaryjoin = 'favorites_table.c.listing_id == Listing.id',
backref = db.backref('users', lazy = 'dynamic'),
lazy = 'dynamic',
)

如果你真的想明确,你可以取消上面两行的注释以获得完全相同的结果。请注意,我在指定的每个 id 列之前添加了一个型号名称。

请注意,在您的 favorites_table 关系表列 user_id 指向 Listing.idlisting_id -> User .id,虽然它看起来应该是相反的。

关于python - Flask 帮助理解多对多关系上的 primaryjoin/secondaryjoin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22110515/

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