我有一个模型Foo,它对用户模型有一个ForeignKey。
稍后,我需要获取所有用户的ID并将其放在列表中
foos = Foo.objects.filter(...)
l = [ f.user.id for f in foos ]
但是当我这样做时,django从数据库中抓取整个User实例,而不是仅仅给出数字用户的id,它存在于每个Foo行中。
如何在不查询每个用户或使用select_related?
的情况下获取所有ID由于
答案 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 ]