获取外键而不请求整个对象

时间:2009-01-24 22:00:44

标签: python django django-models

我有一个模型Foo,它对用户模型有一个ForeignKey。

稍后,我需要获取所有用户的ID并将其放在列表中

foos = Foo.objects.filter(...)

l = [ f.user.id for f in foos ]

但是当我这样做时,django从数据库中抓取整个User实例,而不是仅仅给出数字用户的id,它存在于每个Foo行中。

如何在不查询每个用户或使用select_related?

的情况下获取所有ID

由于

3 个答案:

答案 0 :(得分:5)

使用queryset's values() function,它将返回包含作为参数传递的每个属性的名称/值对的字典列表:

>>> Foo.objects.all().values('user__id')
[{'user__id': 1}, {'user__id' 2}, {'user__id': 3}]

然后,ORM将能够优化SQL查询以仅返回必需的字段,而不是执行“SELECT *”。

答案 1 :(得分:3)

每当你在Django中定义一个ForeignKey时,它会自动为你的模型添加一个FIELD_id字段。

例如,如果Foo的FK为User且属性名为“user”,那么您还有一个名为 user_id 的属性,其中包含相关用户的ID。

l = [ f.user_id for f in foos ]

如果您明智地选择属性,调用.values()也会增加性能

答案 2 :(得分:0)

没关系......我不确定为什么在我尝试之前这不起作用,但这是怎么做的:

l = [ f.user_id for f in foos ]
相关问题