Выберите много ко многим, используя функцию count () - PullRequest
0 голосов
/ 18 декабря 2018

У меня много-много связей, и я пытаюсь найти Пользователя, у которого есть минимальные запросы в моей под-таблице, но я не могу понять, как я могу это сделать.

Не могли бы вы уточнить, как я могу это сделать?это

мои модели:

    subs = db.Table('subs',
                db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
                db.Column('request_id', db.Integer, db.ForeignKey('request.id'))
                )

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120))
    role = db.Column(db.String(120))
    password_hash = db.Column(db.String(120))
    requests = db.relationship('Request', secondary=subs,
                               backref=db.backref('users', lazy='dynamic'))
    post = db.relationship('Posts', backref = 'user', lazy = 'dynamic')
    request = db.relationship('Request', backref='user', lazy = 'dynamic')
    is_active = db.Column(db.String(120))


class Request(db.Model):

    __tablename__ = 'request'

    id = db.Column(db.Integer, primary_key=True)
    org = db.Column(db.String(120))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    cost = db.Column(db.Integer)
    created = db.Column(db.DateTime, default= datetime.utcnow)
    cost_time = db.Column(db.Integer)
    update_time = db.Column(db.DateTime, default = datetime.utcnow())
    diff_time = db.Column(db.DateTime)
    feedback = db.Column(db.Text, default=update_time)
    comment = db.relationship('Posts', backref = 'request', lazy='dynamic')
    rate_idea = db.Column(db.Integer)
    new = db.Column(db.Text)
    cost_buyer = db.relationship('Costs', backref = 'request', lazy='dynamic')
    status = db.Column(db.String(120), db.ForeignKey('status.id'))

Например:

User1.requests = [Request_1, 'Request_2, Request_3]
User2.requests = [Request_2, Request_3]

Когда кто-то делает новый запрос, мне нужно сначала уточнить, какой пользователь имеет минимальные запросы отвсе пользователи, а затем направить ему этот запрос.

New_request = Request(org = 'TEST')

В этом случае User2 должен добавить этот New_request к своим собственным User.requests, поэтому конечный результат должен быть

User1.requests = [Request_1, 'Request_2, Request_3]

User2.requests = [Request_2, Request_3, New_request]

iхочу сделать запрос примерно так, но какое правильное и простое решение для этого я не знаю и хочу знать:

db.query.filter(min(len(User.requests))

1 Ответ

0 голосов
/ 18 декабря 2018

Нечто подобное должно работать.Но я предлагаю вам проверить документы .

from sqlalchemy import func
db.query(User.id, func.count())
    .outerjoin(User.requests)
    .group_by(User.id)
    .order_by(func.count())
    .limit(1)
...