Учитывая следующие модели:
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(255))
taxonomy = db.Column(db.Unicode(), nullable=False)
created_at = db.Column(db.DateTime, default=db.func.now())
updated_at = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())
__mapper_args__ = {
'polymorphic_identity': 'tag',
'polymorphic_on': taxonomy,
'order_by': name
}
class FooTag(Tag):
id = db.Column(db.Integer, db.ForeignKey('tag.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity': 'foo'
}
class BarTag(Tag):
id = db.Column(db.Integer, db.ForeignKey('tag.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity': 'bar',
}
class Profile(db.Model):
foo_tags = db.relationship(
"FooTag",
secondary=profiles_tags,
secondaryjoin="and_(Tag.id==profiles_tags.c.tag_id, Tag.taxonomy=='foo')",
uselist=True,
lazy='dynamic'
)
bar_tags = db.relationship(
"BarTag",
secondary=profiles_tags,
secondaryjoin="and_(Tag.id==profiles_tags.c.tag_id, Tag.taxonomy=='bar')",
uselist=True,
lazy='dynamic'
)
Есть ли в любом случае, что я могу отфильтровать Profile
объекты по набору Tag
с, а затем упорядочить результаты по количеству совпадающих Tag
s?т.е.
foo_tags=[2, 4, 6]
bar_tags=[8, 22, 14]
results = Profile.join(Profile.foo_tags).filter(FooTag.id.in_(foo_tags)).\
join(Profile.bar_tags).filter(BarTag.id.in_(bar_tags)).\
paginate(1, 20)
Где порядок results
определяется тем, сколько совпадений foo_tags
/ bar_tags
было найдено в каждом возвращаемом объекте?
Это Python==2.7
,Flask==0.12.2
, SQLAlchemy==1.1.11
, Flask-SQLAlchemy==2.3.2