Python SQLAlchemy与过滤连接不';我真的不过滤

Python SQLAlchemy与过滤连接不';我真的不过滤,python,database-design,orm,sqlalchemy,flask,Python,Database Design,Orm,Sqlalchemy,Flask,问题在主题的标题中。下面是细节 我正在使用Flask SQLAlchemy和PostgreSQL,我的db模式如下: class Settings(db.Model): id = db.Column(db.Integer, primary_key=True) key = db.Column(db.String(), unique=True) lang = db.relationship('Lang', order_by='Lang.id') def __ini

问题在主题的标题中。下面是细节

我正在使用Flask SQLAlchemy和PostgreSQL,我的db模式如下:

class Settings(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    key = db.Column(db.String(), unique=True)

    lang = db.relationship('Lang', order_by='Lang.id')

    def __init__(self, key, lang):
        self.key = key
        self.lang = lang

    def __repr__(self):
        return '<Settings %r, %r>' % (self.key, self.lang)

class Lang(db.Model):
    __tablename__ = 'settings_lang'
    id = db.Column(db.Integer, primary_key=True)
    lang = db.Column(db.String(2))
    value = db.Column(db.Text())

    parent_id = db.Column(db.Integer, db.ForeignKey('settings.id'))

    def __init__(self, lang, value):
        self.lang = lang
        self.value = value

    def __repr__(self):
        return '<Lang %r, %r>' % (self.lang, self.value)
for data in db.session.query(Settings).join(Lang).filter(Lang.lang.contains('en')).all():
    print data
并期望它只返回带有“en”语言的设置。但是,我得到了所有的语言

问题可能是什么?如何处理

UPD:SQL输出

SELECT settings.id AS settings_id, settings.key AS settings_key 
FROM settings JOIN settings_lang ON settings.id = settings_lang.parent_id 
WHERE settings_lang.lang LIKE '%%' || %(lang_1)s || '%%'
{'lang_1': 'en'}

SELECT settings_lang.id AS settings_lang_id, settings_lang.lang AS settings_lang_lang, 
       settings_lang.value AS settings_lang_value,
       settings_lang.parent_id AS  settings_lang_parent_id 
FROM settings_lang 
WHERE %(param_1)s = settings_lang.parent_id ORDER BY settings_lang.id
{'param_1': 1}
设置中的示例行\u lang:

id parent_id lang value 1 1 "en" "Research" 2 1 "ru" "НПП" id父项\u id语言值 1 1“en”“研究”
2 1“ru”“ППП”另请参阅如何打印由AlchemyTank执行的原始sql查询,可能会有所帮助。也许查询是以某种方式构造的,第一个查询看起来正常,它只加载设置对象,但最好编写
过滤器(Lang.Lang='en')
。第二个只是按照关系后面的id加载
Lang
。所以我不相信你的查询会加载所有设置。请再次查看您的数据库和程序输出。问题是设置不包含语言。它包含id和key,但Lang包含id、parent\u id、value和Lang。因此,当我们按id检索记录时,它返回两种语言,因为parent\u id对于这两种语言都是相同的,似乎我只是意外地解决了我的问题。下面的查询给出了我想要的:
db.session.query(Settings.key,Lang.value).join(Settings.Lang).filter(Lang.Lang=='en')