SQLAlchemy ORM top N через многие ко многим отношениям - PullRequest
0 голосов
/ 16 июня 2020

У меня 3 модели: Trail, Review и Attribute. Trail может иметь много Reviews, а Review может иметь много Attributes (через модель ReviewAttribute). Я хочу получить все Trails верхние N Attributes, где «верхние N» означает верхние N Attributes в большинстве обзоров для следа, поэтому в основном дан след, подсчитайте его сгруппированные атрибуты, отсортируйте по количеству, и возьмите верхний N.

Соответствующий код для моделей:

class Trail(Base):
    id = Column(Integer(), primary_key=True)

    # One to many
    reviews = relationship("Review", lazy=True)
    reviewAttributes = relationship(
        'ReviewAttribute',
        primaryjoin='and_(Trail.id == Review.trailId)',
        secondary='join(Review, ReviewAttribute, Review.id == ReviewAttribute.reviewId)',
        viewonly=True,
        lazy=True
    )


class Review(Base):
    id = Column(Integer(), primary_key=True)

    trailId = Column(BigInteger(), ForeignKey('trails.id'))

    # One to many
    trail = relationship("Trail", back_populates="reviews", lazy=True)


class Attribute(Base):
    id = Column(Integer(), primary_key=True)

    attributeLabel = Column(String())


class ReviewAttribute(Base):
    reviewId = Column(BigInteger(), ForeignKey('reviews.id'), primary_key=True)
    attributeId = Column(BigInteger(), ForeignKey('attribute_labels.id'), primary_key=True)

    # Many to many
    attribute = relationship("Attribute", lazy=True)
    review = relationship("Review", lazy=True)

Я могу получить все Attributes на Trail через связь reviewAttributes, но не могу выяснить, как смоделировать отношения или запрос, чтобы получить только 3 лучших по количеству. Я смог сделать это в python, используя collections.Counter из этого отношения, но хотел бы сделать это в SQL, если это возможно для эффективности.

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