gpt4 book ai didi

python - Django/python 查询集 - 将另一个 "child"查询集作为项目添加到每个列表对象?

转载 作者:行者123 更新时间:2023-12-01 05:58:55 24 4
gpt4 key购买 nike

如果答案很明显,我深表歉意 - 我对 django/python 非常陌生,到目前为止还无法在搜索中找到解决方案。

我有一个简单的查询集,例如

members = LibraryMembers.objects.all()

有了这个我可以做到:-

for m in members:
member_books = LibraryBorrows.objects.filter(member_id=m[u'id'])

我真正想要的是能够将结果序列化为 json,所以它看起来像这样:-

{
"members":
[
{
"id" : "1",
"name" : "Joe Bloggs"
"books":
[
{
"name" : "Five Go Exploring",
"author" : "Enid Blyton",
},
{
"name" : "Princess of Mars",
"author" : "Edgar Rice Burroughs",
},
]
}
]
}

在我看来,显而易见的尝试是:-

for m in members:
m[u'books'] = LibraryBorrows.objects.filter(member_id=m[u'id'])

但是我收到 TypeError: 'LibraryBorrows' 对象不支持项目分配

有什么办法可以实现我所追求的目标吗?

最佳答案

模型实例确实不是字典。现在,如果您想要字典而不是模型实例,那么 Queryset.values() 是您的 friend - 您将获得仅包含必需字段的字典列表,并且避免了从 Queryset.values() 检索不需要的字段的开销数据库并构建成熟的模型实例。

>> members = LibraryMember.objects.values("id", "name")
>> print members
[{"id" : 1, "name" : "Joe Bloggs"},]

那么你的代码将如下所示:

members = LibraryMember.objects.values("id", "name")
for m in members:
m["books"] = LibraryBorrows.objects.filter(
member_id=m['id']
).values("name", "author")

现在您仍然必须为每个父行发出一个额外的数据库查询,这可能效率不高,具体取决于 LibraryMember 的数量。如果您有数百个或更多 LibraryMember,更好的方法是在 LibraryBorrow 上查询,包括 LibraryMember 中的相关字段,然后根据 LibraryMember id 重新组合行,即:

from itertools import group_by

def filter_row(row):
for name in ("librarymember__id", "librarymember__name"):
del row[name]
return row

members = []
rows = LibraryBorrow.objects.values(
'name', 'author', 'librarymember__id', 'librarymember__name'
).order_by('librarymember__id')


for key, group in group_by(rows, lambda r: r['librarymember__id']):
group = list(group)
member = {
'id' : group[0]['librarymember_id'],
'name':group[0]['librarymember_name']
'books' = [filter_row(row) for row in group]
}
members.append(member)

注意:这可以被视为过早的优化(如果您的数据库中只有几个 LibraryMember,则可能是这样),但是用数百个或更多的查询来换取一个查询和一些后处理通常会对“现实生活”数据集。

关于python - Django/python 查询集 - 将另一个 "child"查询集作为项目添加到每个列表对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11374277/

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