以下型号具有一对多关系,孩子可以拥有一些玩具系列:
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,然后迭代它们自己创建一个字典?在元组列表中表示的值的结构并不重要,它可以是嵌套字典或其他东西,但我只想通过按孩子名称键入结果字典来为孩子提供所有玩具。
提前致谢。
答案 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之后将列表处理成字典可能会更快。