在joined中的ArgumentError

时间:2014-11-06 00:57:08

标签: python orm flask sqlalchemy flask-sqlalchemy

我有这些模特:

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.

这里有什么问题?

1 个答案:

答案 0 :(得分:3)

这里不需要joinedload

默认情况下,关系是延迟加载的。这会导致发出额外的SELECT个查询以检索数据。 joinedload是通过使用JOIN来强制加载关系的方法之一。

但是,在这种情况下,您通过指定User默认了Countrylazy='joined'之间的关系以使用预先加载。这会将您的查询减少到

User.query.filter(id=current_user.get_id()).first()

虽然这可以帮助您ArgumentError,但我们可以更进一步。查询本身也是不必要的。由于热切加入,current_user已经拥有其相关Country的数据。访问current_user.user_country不会向数据库发送任何其他查询。