django查询检索由父名称键入的子项值字典?

时间:2018-04-13 16:49:20

标签: python django dictionary

以下型号具有一对多关系,孩子可以拥有一些玩具系列:

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,然后迭代它们自己创建一个字典?在元组列表中表示的值的结构并不重要,它可以是嵌套字典或其他东西,但我只想通过按孩子名称键入结果字典来为孩子提供所有玩具。

提前致谢。

1 个答案:

答案 0 :(得分: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之后将列表处理成字典可能会更快。