Django:如何从querydi获取一个以相关对象为键的字典

2024-09-27 23:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有以下模型:(简化)

class Collection(models.Model):
    slug = models.SlugField()

class Brochure(models.Model):
    collection = models.ForeignKey(Collection)

class Page(models.Model):
    brochures = models.ManyToMany(Brochure)
  • 有两个集合“x”和“y”。在
  • 一个页面有一些小册子,而不是全部。在

有没有办法得到这样的小册子词典:

^{pr2}$

只有使用多对多管理器:

page_instance.brochures.all()

编辑

我想和佩奇有关的小册子。不是小册子.objects.all()或集合_instance.brooker_集. 所以我把佩奇也包括在内。在

我找到了defaultdict,这有助于我:

collection_brochures = defaultdict(list)
for b in self.brochures.all():
    collection_brochures[b.collection.slug].append(b)

实际上这就是我问题的答案。在

我可以这样做,但理想的情况是列出一个包含以下内容的清单:

[{'collection': 'x', 'brochures': [brochure1, brochure2]}, {'collection': 'y', 'brochures': [brochure3, brochure4]}]

Tags: instance模型modelmodelsallclasscollectionslug
1条回答
网友
1楼 · 发布于 2024-09-27 23:26:38

我希望这个代码片段能完成这项工作。在

collection_brochures = defaultdict(list)
for b in self.brochures.all():
    collection_brochures[b.collection.slug].append(b)
result = []
for collection, brochures in collection_brochures.iteritems():
    result.append({'collection': collection, 'brochures': brochures})

您还可以使用模型实例作为键,因此,如果您希望看到Collection实例而不是它们的slug,您可以将第三行替换为这个:

^{pr2}$

这将为您提供以下数据:

[{'collection': collection_x, 'brochures': [brochure1, brochure2]},
 {'collection': collection_y, 'brochures': [brochure3, brochure4]}]

相关问题 更多 >

    热门问题