ترتيب SQLAlchemy من خلال الاعتماد على علاقة كثير إلى كثير

StackOverflow https://stackoverflow.com/questions/5973553

سؤال

وهذا مثال مبسط لنماذجي الحالية (أنا أستخدم ملحق قارورة SQLAlchemy):

like = db.Table(
    'like',
    db.Column('uid', db.Integer, db.ForeignKey('users.id')),
    db.Column('pid', db.Integer, db.ForeignKey('posts.id'))
)

class User(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(20))

class Post(db.Model):
    __tablename__ = 'posts'

    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(255))

    likes = db.relationship(
        'User',
        secondary = like,
        backref = db.backref('likes', lazy = 'dynamic'),
        lazy = 'dynamic'
    )

أحاول أن أطلب Postبمقدار الإعجابات لديها.

هذا هو الاستعلام الذي أحاول إصداره بشكل أساسي:

SELECT p.*, COUNT(l.`pid`) as `likes`
FROM `posts` as p
LEFT JOIN `like` as l
    ON p.`id` = l.`pid`
GROUP BY p.`id`
ORDER BY `likes` DESC

لم أتمكن من الحصول على أي شيء يعمل على جانب SQLAlchemy من الأشياء.

شكرا على اي مساعدة أي شخص يمكن أن تقدم.

هل كانت مفيدة؟

المحلول

لم أستخدم SQLAlchemy كثيرًا لذا فكرت في تجربة ذلك.لم أحاول استخدام نماذجك، لقد كتبت فقط بعض النماذج الجديدة (على الرغم من أنها مشابهة بما فيه الكفاية):

likes = db.Table('likes',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('post_id', db.Integer, db.ForeignKey('post.id'))
)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20))

    def __repr__(self):
        return "<User('%s')>" % self.username

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255))

    likes = db.relationship('User', secondary = likes,
        backref = db.backref('posts', lazy='dynamic'))

    def __repr__(self):
        return "<Post('%s')>" % self.title

تريد الانضمام إلى likes الجدول، استخدام func.count لحساب الإعجابات، group_by Post ثم استخدم order_by:

db.session.query(Post, func.count(likes.c.user_id).label('total')).join(likes).group_by(Post).order_by('total DESC')

لقد وجدت البرنامج التعليمي ORM وبقية وثائق SQLAlchemy مفيدة جدًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top