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

标签 python django typeerror django-queryset

如果答案很明显,我深表歉意 - 我对 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/

相关文章:

django - 两个 gunicorn 应用程序(django 和tilestache)的Nginx conf

python - 我想按升序对所有字典进行排序,但每当我得到相同的值时,按降序对它们进行排序

python-3.x - Python HTTP Post 方法将响应作为 magicmock 对象而不是值返回

python - 分配张量时Python中的ResourceExhaustedError

python - 使用递归 Python 计算项目在序列中出现的次数

python - 新的主管 - 如何制作一个有效的守护进程

python - Odoo - 自定义模板菜单加载

Django Rest Framework 测试 API 响应断言

python - Django QuerySet/Manager 从生日开始按年龄过滤员工

java - IContributionRoot 类型的方法 addContributionItem(IContributionItem, Expression) 指的是缺少的类型 Expression