我有这些模特:
class User(UserMixin, db.Model):
__tablename__ = 'users_user'
...
country = db.Column(db.Integer, db.ForeignKey('countries.id'))
class Country(db.Model):
__tablename__ = 'countries'
id = db.Column(db.Integer, primary_key=True)
...
user_country = db.relationship('User', backref='user_country', lazy='joined')
我正在尝试此查询:
User.query.options(joinedload(Country.user_country)).filter_by(id=current_user.get_id()).first()
这将抛出此错误:
ArgumentError: Can't find property 'user_country' on any entity specified in this Query.
Note the full path from root (Mapper|User|users_user) to target entity must be specified.
这里有什么问题?
答案 0 :(得分:3)
这里不需要joinedload
。
默认情况下,关系是延迟加载的。这会导致发出额外的SELECT
个查询以检索数据。 joinedload
是通过使用JOIN
来强制加载关系的方法之一。
但是,在这种情况下,您通过指定User
默认了Country
和lazy='joined'
之间的关系以使用预先加载。这会将您的查询减少到
User.query.filter(id=current_user.get_id()).first()
虽然这可以帮助您ArgumentError
,但我们可以更进一步。查询本身也是不必要的。由于热切加入,current_user
已经拥有其相关Country
的数据。访问current_user.user_country
不会向数据库发送任何其他查询。