sql – Django使用过滤器保留外连接
发布时间:2020-12-12 06:40:09 所属栏目:MsSql教程 来源:网络整理
导读:我正在使用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的内置用户模型,并拥有一个带有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>) 但是这会生成与此类似的SQL: 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) # ... (这不再做任何数据库工作或传输比LEFT OUTER JOIN更多的数据了,所以我认为这是一种合理的方法.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |