0

我有一个模型 Foo ,它具有 User 模型的 ForeignKey 。

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

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

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

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

如何在不查询每个用户或使用 select_related 的情况下获取所有 id?

谢谢

4

3 回答 3

5

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

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

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

于 2009-01-25T00:41:14.867 回答
3

每当您在 Django 中定义 ForeignKey 时,它都会自动将 FIELD_id 字段添加到您的模型中。

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

l = [ f.user_id for f in foos ]

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

于 2009-01-28T05:11:17.887 回答
0

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

l = [ f.user_id for f in foos ]
于 2009-01-24T22:41:20.383 回答