在Flask-SQLAlchemy中加入后过滤

kel*_*dem 0 python sqlalchemy flask flask-sqlalchemy

我有两个表(locationcountry)试图查询; 在我的烧瓶应用中由下面的模型表示

from sqlalchemy import Column, DateTime, ForeignKey, Integer, \
                       Numeric, SmallInteger, String, Table
from sqlalchemy.orm import relationship
from sqlalchemy.schema import FetchedValue
from flask_sqlalchemy import SQLAlchemy


db = SQLAlchemy()


class Country(db.Model):
    __tablename__ = 'country'

    country_id = db.Column(db.Integer, primary_key=True)
    country_name = db.Column(db.String(30), nullable=False)
    full_country_name = db.Column(db.String(90), nullable=False)
    country_code = db.Column(db.String(4), nullable=False)

    def __str__(self):
        return '%s' % self.country_name

    def __repr__(self):
        return '<Country %r>' % self.country_name


class Location(db.Model):
    __tablename__ = 'location'

    location_id = db.Column(db.Integer, primary_key=True)
    location_name = db.Column(db.String(75), nullable=False)
    country_id = db.Column(db.ForeignKey('mashamba.country.country_id'), nullable=False, index=True)

    country = db.relationship('Country', primaryjoin='Location.country_id == Country.country_id', backref='locations')

    def __str__(self):
        return '%s' % self.location_name

    def __repr__(self):
        return '<Location %r>' % self.location_name
Run Code Online (Sandbox Code Playgroud)

我们要做的是通过使用以下代码执行连接来获取两个表中的所有列

Location.query.join(Country).\
                filter_by(location_name='Cairo',
                          country_id=67).first()
Run Code Online (Sandbox Code Playgroud)

问题是,当我运行代码时,我得到以下错误

sqlalchemy.exc.InvalidRequestError: Entity '<class 'app.models.Country'>' has no property 'location_name'
Run Code Online (Sandbox Code Playgroud)

当您运行此代码时,一切正常

Location.query.join(Country).all()
Run Code Online (Sandbox Code Playgroud)

这有什么问题,如何解决?

Ilj*_*ilä 7

filter_by()适用于查询的主要实体,或者作为目标的最后一个实体join().在你的情况下Country,它没有必需的属性.在联接之前使用filter()或移动呼叫filter_by(location_name=...):

Location.query.\
    filter_by(location_name='Cairo').\
    join(Country).\
    filter_by(country_id=67).\
    first()
Run Code Online (Sandbox Code Playgroud)