与SQL-Alchemy
合作,我想实施一些我遇到问题的特定功能。首先,这里有一些背景。
我有一个类似于以下内容的Review
表:
id user item review_score
1 Bob Bicycle 1
2 Jane Apple 5
3 Dan Table 4
4 John Car 2
5 Bob Table 4
.. ... ... ...
现在,让我们按如下方式表达用户及其审核的项目:
Bicycle Apple Table Car
Bob 1 N/A 4 N/A
Jane N/A 5 N/A N/A
Dan N/A N/A 4 N/A
John N/A N/A N/A 2
然后我可以通过relationship()
到Review
表生成哪些项目进行了审核,以及每个人的得分,反之亦然users
及其items
使用sql-alchemy
示例:
class User(UserMixin, Base):
__tablename__ = 'users'
userid = Column(Integer, primary_key=True)
reviews = relationship('Review', backref='user')
这非常适合允许通过简单的成员访问权限对每位用户进行即时查看:user.reviews
。
以下是Review
模型的样子:
class Review(Base):
__tablename__ = 'reviews'
reviewid = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
userid = Column(Integer, ForeignKey('users.userid'), nullable=False)
itemid = Column(Integer, ForeignKey('items.itemid'), nullable=False)
review_score = Column(Integer, nullable=False)
现在,我正在迭代嵌套循环中的每个项目,以查看哪些用户同时评定了items_i
& items_j
(当前的实现,我不满意;但是工作):
for item_i in Item.query.all():
users_i = {review.userid : review.review_score for review in item_i.reviews}
for item_j in Item.query.all():
users_j = {review.userid: review.review_score for review in item_j.reviews}
# There must be a better way to get the users that reviewed both via the SQL-Alchemy query() API.
users_that_rated_both_items = users_i.keys() & users_j.keys()
if users_that_rated_both_movies:
# I need these two vectors below for future computations.
reviews_i = [review.review_score for review in item_i.reviews if review.userid in users_that_rated_both_movies]
reviews_j = [review.review_score for review in item_j.reviews if review.userid in users_that_rated_both_movies]
# I do more computations here...
我基本上需要为每个用户和item_i
和item_j
建立一对评论对。
查看我尝试做的事情的一种非常简单的方法如下:
获取两个共享相同用户的商品的评论(因此评论的长度与他们共享相同的用户完全相同):len(item_i.reviews) == len(item_j.reviews)
有没有办法以更惯用的方式使用SQL-Alchemy提取这些数据?与我当前的方式相反,这涉及到userid
'使用python' s set
内置。
感谢。