【问题标题】:django query to retrieve dictionary of children values keyed by parent name?django 查询以检索由父名称键入的子值字典?
【发布时间】:2018-04-13 16:49:19
【问题描述】:

使用以下具有一对多关系的模型,孩子可以收集一些玩具:

class Kid(models.Model):
    name = models.CharField(max_length=200)

class Toy(models.Model):
    name = models.CharField(max_length=200)
    material = models.CharField(max_length=200)
    owner = models.ForeignKey(Kid)

我想生成一个字典,其中孩子的名字作为键,元组列表作为值。

以下查询让我得到元组列表,如下所示:

kids = Kid.objects.all()
kids.filter( toy__name__in[ some list of names ] ).\
   values_list( 'name', 'toy__name', 'toy__material' )

[ ( 'billy', 'hotwheelscar', 'metal' ),
  ( 'billy', 'actionFigure', 'plastic' ),
  ( 'sam', 'hotwheelscar', 'metal' ),
  ( 'sam', 'doll', 'plastic' ),
  ( 'sam', 'dollHouse', 'plastic' ),
  ( 'jimmy', 'hotwheelscar', 'metal' ),
  ( 'jimmy', 'actionFigure', 'plastic' ) ]

但是有没有一种方法可以让我以如下形式获得这些结果:

{ 'billy': [ ( 'hotwheelscar', 'metal' ), ( 'actionFigure', 'plastic' ) ],
  'sam':   [ ( 'hotwheelscar', 'metal' ), ( 'doll', 'plastic' ), ( 'dollhouse', 'plastic' ) ],
  'jimmy': [ ( 'hotwheelscar', 'metal' ), ( 'actionFigure', 'plastic' ) ] }

不必像我之前那样首先检索元组的 values_list,然后自己迭代它们创建字典?元组列表中表示的值的结构并不重要,它可以是嵌套字典或其他东西,但我只想通过按孩子名字键入结果字典来为孩子提供所有玩具。

提前致谢。

【问题讨论】:

标签: python django dictionary


【解决方案1】:

查询不会返回字典,但您可以使用字典理解将其写得更简洁:

{kid.name: list(kid.toy_set.filter(name__in=names).values_list('name', 'material')) 
 for kid in Kid.objects.filter(toy__name__in=names)}

这可能对性能不利,具体取决于您需要遍历多少数据,因为它会为每个孩子运行一个额外的查询来获取玩具。如果是这样,运行您拥有的查询并将列表处理成 Python 中的字典可能会更快。

【讨论】:

  • 谢谢,这个解决方案对我很有效,因为我没有那么多孩子,但每个孩子都有很多玩具。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多