Python SQLAlchemy查询公共属性?

Python SQLAlchemy查询公共属性?,python,sqlalchemy,Python,Sqlalchemy,我有一个电影和属于这些电影的类别的关联表,我想得到两部电影之间的所有公共类别(只需要类别的id) 因此,如果这两部电影都有“Thriller”类别,其类别id为5,我想得到5。如果它们没有公共类别,它只返回一个也没有 表如下所示: class MovieCategoryScores(db.Model): movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'), primary_key=True) category_id

我有一个电影和属于这些电影的类别的关联表,我想得到两部电影之间的所有公共类别(只需要类别的id)

因此,如果这两部电影都有“Thriller”类别,其类别id为5,我想得到5。如果它们没有公共类别,它只返回一个也没有

表如下所示:

class MovieCategoryScores(db.Model):
    movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'), primary_key=True)
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'), primary_key=True)
    score = db.Column(db.Integer)
    votes = db.Column(db.Integer)
    category = relationship("Category", back_populates="movies")
    movie = relationship("Movie", back_populates="categories")
我知道我可以质疑
categories=MovieCategoryScores.query.filter(MovieCategoryScores.movie\u id.in.[movie1,movie2])。all()
为了获取所有类别,我尝试在查询后放置
(MovieCategoryScores.category\u id)
,以仅获取id,但这不起作用,我只得到了一个
类型错误:“BaseQuery”对象不可调用
错误

如果我知道如何获取ID,我可以使用以下方法:

categories.sort()
for index, category_id in enumerate(categories.copy()):
    if categories[index+1] != category_id:
        categories[index].remove()
return categories
要获得一个只有两个id的列表,但感觉应该有更好的方法,可以通过查询命令获得两个具有相同类别id的项目的id


任何一种解决方案都将非常感激

好吧,在经历了很多头痛之后,我想到了这个:

def get_common_categories(movie1, movie2):
    categories = MovieCategoryScores.query.with_entities(MovieCategoryScores.category_id).filter(MovieCategoryScores.movie_id.in_([movie1, movie2])).all()
    categories.sort()
    common = []
    for index, category in enumerate(categories):
        if index+1 < len(categories) and categories[index+1] == category:
            common.append(category[0])
    return common
def get_common_类别(电影1、电影2):
categories=MovieCategoryScores.query.with_实体(MovieCategoryScores.category_id).filter(MovieCategoryScores.movie_id.in_uu([movie1,movie2])。all()
categories.sort()
公共=[]
对于索引,枚举中的类别(类别):
如果索引+1

感觉很愚蠢,似乎只有通过查询和筛选才能做到这一点,但无法解决这一点,所以现在只能这样做。

您可以使用
having
func.count()>1
来获得
distinct
的相反结果(
having
需要
group\u by

来自sqlalchemy导入函数
categories=MovieCategoryScores.query.with_实体(MovieCategoryScores.category_id).过滤器(MovieCategoryScores.movie_id.in_([movie1,movie2])).分组依据(MovieCategoryScores.category_id).具有(funct.count(MovieCategoryScores.category_id)>1.all()
或者,如果要检索
Category.name
,可以执行以下操作:

来自sqlalchemy导入函数
categories=MovieCategoryScores.query.with_实体(MovieCategoryScores.name)。过滤器(MovieCategoryScores.movie_id.in_uu([movie1,movie2])。分组依据(MovieCategoryScores.category)。具有(funct.count(MovieCategoryScores.category)>1)。全部()

使用我自己的SQLAlchemy-SQLite3数据库,你看到我的答案了吗?这能得到你想要的结果吗?我一直在想如何使用它,因为它与我想要的正好相反?它只给你其中一个的身份证,而我要他们两个都有的身份证?还是我误解了它的作用?啊,我明白了。我已经修改了我的答案以得到想要的结果。啊,哇,这正是我想要的,非常感谢!现在也开始认识到常规SQL的共同点了,谢谢!但是,当将.with_实体更改为MovieCategoryScores.category以尝试获取category对象时,我只得到一个包含“True”或“False”的元组数组,知道为什么会这样吗?或者更确切地说,有没有什么方法可以解决这个问题,而不是简单地先获取整个内容,然后获取类别?请参阅我的更改如何检索类别的名称。如果你删除
.name
,你应该会得到这个对象。哦,我正在引用我想要的类别对象,它在关联表中是引用的(类别=关系(“category”,back_populates=“movies”)),但是经过一些研究,我认为这是不可能的,所以我想出了一个自己的解决方案,非常感谢你的帮助!