使用函数count()选择多对多



我有很多对很多的关系,我试图在我的子表中找到请求最少的用户,但我不明白我该怎么做。

你能澄清一下我怎么做吗

我的型号是:

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.request中,因此最终结果必须是

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

我想做这样的查询,但什么是正确和简单的解决方案,我不知道,我想知道:

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

这样的东西应该可以工作。但我建议你检查一下文件。

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

最新更新