sql – Django使用过滤器保留外连接

前端之家收集整理的这篇文章主要介绍了sql – Django使用过滤器保留外连接前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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更多的数据了,所以我认为这是一种合理的方法.)

原文链接:https://www.f2er.com/mssql/78357.html

猜你在找的MsSQL相关文章