我正在使用Django的内置用户模型,并拥有一个带有ForeignKey to User的自定义Foo对象.我想要选择所有User对象和所有符合某些约束的Foo对象,如下所示:
SELECT * from auth_user LEFT OUTER JOIN "foo" ON (auth_user.id = foo.id AND <other criteria here>)
我应该如何在Django中实现这一目标?到目前为止,我已经尝试过:
User.objects.filter(foo__<criteria>)
SELECT * from auth_user LEFT OUTER JOIN "foo" ON (auth_user.id = foo.id) WHERE <other criteria here>
并且仅返回具有符合条件的Foo对象的User对象.或者,我可以选择所有用户对象并为每个对象运行查询,但这样效率会大大降低.
解决方法
如果您希望Django获取所有User对象以及与用户对象相关的所有Foo对象,那么您将使用
select_related()
:
User.objects.all().select_related('foo')
但是在这里你不想要所有与用户对象相关的Foo对象,你只需要它们的子集满足你的标准.我不知道如何告诉Django在单个查询集中执行此操作.但你可以做的是分别做两个选择并在Python中进行连接:
# Map from user id to corresponding Foo satisfying <criteria>,if any. foos = {foo.user_id: foo for foo in Foo.objects.filter(user__isnull = False,<criteria>)} for user in User.objects.all(): foo = foos.get(user.id) # ...