Как получить последние результаты, используя два атрибута связанных объектов - PullRequest
0 голосов
/ 28 марта 2019

Используя SQLAlchemy, я имею следующую конструкцию моделей:

Category
    - slug as String (unique)
    ...

Sample
    - label
    ...

Result
    - sample_id (relation)
    ...

Specs
    - result_id (relation)
    - category_id (relation)
    - version as Integer
    ...

Мне удалось получить последние результаты для всех образцов, используя объяснение в Запрос фильтра SQLAlchemy по связанному объекту ицикл python for:

def get_latest_results(sample):
    subq = db.session.query(Specs.category_id, func.max(Specs.version).label('latest_version')) \
        .filter(Specs.result.any(sample=sample)) \
        .group_by(Specs.category_id).subquery('t2')

    query = db.session.query(Result).join(
        subq,
        and_(
            Result.specs.has(category_id=subq.c.category_id),
            Result.specs.has(version=subq.c.latest_version),
            Result.sample == sample,
        )
    ).all()
    return query


for sample in Sample.query.all():
    print(get_latest_results(sample))

Теперь я пытаюсь создать запрос sqlalchemy, который выполняет все в одной конструкции.

До сих пор каждая попытка приводила к отсутствующим или дополнительным нежелательным результатам...

Входные данные выглядят примерно так:

Sample-1 Result-1 Specs-1-version-1 Category A
Sample-1 Result-2 Specs-2-version-2 Category A
Sample-1 Result-3 Specs-3-version-1 Category B
Sample-2 Result-4 Specs-4-version-1 Category A
Sample-2 Result-5 Specs-5-version-1 Category B

Желаемый результат (на самом деле я хочу, чтобы объекты Result, я показываю здесь все связанные данные для полноты), выглядит примерно так:

Sample-1 Result-2 Specs-2-version-2 Category A
Sample-1 Result-3 Specs-3-version-1 Category B
Sample-2 Result-4 Specs-4-version-1 Category A
Sample-2 Result-5 Specs-5-version-1 Category B

Есть идеи по созданию этого набора запросов?

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