sqlalchemy join выбирает все из дочерней таблицы, не делая вид - PullRequest
0 голосов
/ 18 июня 2020

У меня две таблицы.

class ProductCatsTranslations(db.Model):
    __tablename__ = 'productcats_translation'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(100))
    catid = db.Column(db.Integer, db.ForeignKey('productcats.id'))
    language_code = db.Column(db.Unicode(5), default='en')

class ProductCats(db.Model):
    __tablename__ = 'productcats'

    id = db.Column(db.Integer, primary_key=True)
    translation = db.relationship('ProductCatsTranslations', backref='productcat')
    ... 

    def get(self, lang="en"):
        categories = db.session.query(ProductCats).join(ProductCatsTranslations, ProductCats.translation).\
        filter(ProductCatsTranslations.language_code==lang)
        return categories

Проблема; Categories [0] .translation по-прежнему имеет все языки, лучше это список всех языков. Не имеет значения, использую ли я «uselist = False» в качестве параметра Relationshiop. Как это происходит, он выбирает все, в то время как прямой дамп оператора имеет следующий запрос, который кажется правильным и ожидаемым, который выбирает только ожидаемый вывод для одного языка. В этом случае используется с get (lang = 'es').

Но экземпляр Categories.translation по-прежнему имеет все три языка (en, es, de) в списке переводов.

print(len(categories[0].translation))
3

SQL оператор из того же объекта:

categories.statement.compile(compile_kwargs={"literal_binds": True}))

SELECT productcats.id, productcats.foldername, productcats.gender productcats.active 
FROM productcats JOIN productcats_translation ON productcats.catid = productcats_translation.catid 
WHERE productcats_translation.language_code = 'es'

plain SQL запрос выше возвращает правильный результат только для одного языка

Что я пропустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...