gpt4 book ai didi

python - 如何使用 SQLAlchemy ORM 构建查询

转载 作者:行者123 更新时间:2023-11-29 14:01:52 27 4
gpt4 key购买 nike

我有 3 个模型,如下所示(简化):

用户:

id
username

资源:

id
name
description

评论:

id
user_id (relationship User)
resource_id (relationship Resource)
data
date_created

我正在尝试查询用户的评论并按资源对它们进行分组。我希望返回的结果如下:[(资源 A,[评论,评论,评论,...]),(资源 B,[评论,评论,...]),(资源 X,[评论])]

我尝试了多种构建此方法的方法,但我似乎无法弄清楚。做这样的事情的正确方法是什么?

编辑

现在代码如下所示:

contrib = db_session.query(Resource).filter(Comment.user==user, Resource.uuid==Comment.resource_id).distinct(Comment.resource_id).order_by(desc(Comment.date_created))
comments = db_session.query(Comment, Resource).filter(Comment.user==user, Comment.resource_id.in_([r.uuid for r in contrib]), Resource.uuid==Comment.resource_id).order_by(desc(Comment.date_created))

然后我使用一些列表/字典理解将这些结果组合成看起来像这样的内容

[{resource: Resource, comments:[Comment, Comment, Comment]}, {resource: Resource, comments:[Comment, .....]}, .....]

必须有更好的方法来做到这一点!

最佳答案

您可以使用自定义 MappedCollection对评论进行分组:

from sqlalchemy.orm.collections import collection, MappedCollection

class GroupedCollection(MappedCollection):

def __init__(self):
super(GroupedCollection, self).__init__(
self,
lambda e: e.resource_id # the key we want to group by
)

@collection.internally_instrumented
def __setitem__(self, key, value, _sa_initiator=None):
if key in self:
# there is already another comment for that resource
# we simply append the comment (or you could do something
# more fancy here if you would like to order the comments)
self[key]['comments'].append(value)
else:
# we create a new entry with a dictionary containing the
# resource and comment
super(GroupedCollection, self).__setitem__(
key,
{'resource': value.resource, 'comments': [value]},
_sa_initiator
)

然后在您的User类上添加对应关系:

class User(Base):

# ...

grouped_comments = relationship(
'Comment',
collection_class=GroupedCollection
)

访问它将为您提供按资源分组的评论:

>>> user.grouped_comments
{
'resource_id_1': {'resource': <Resource 1>, 'comments': [<Comment ...>, <Comment ...>]},
'resource_id_2': {'resource': <Resource 2>, 'comments': [<Comment ...>]}
}
>>> user.grouped_comments.values()
[
{'resource': <Resource 1>, 'comments': [<Comment ...>, <Comment ...>]},
{'resource': <Resource 2>, 'comments': [<Comment ...>]}
]

请注意,此关系只能用于查看相关模型,启用添加/删除模型需要额外的工作。

最后,如果这是您想要重现的模式,您可以轻松创建一个 GroupedCollection 工厂函数,您可以在其中指定分组键。

关于python - 如何使用 SQLAlchemy ORM 构建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14940500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com