关于改变 django select_related的join连表方式(inner join/ left join)

关于改变 django select_related的join连表方式(inner join/ left join)

django可以使用select_related预加载外键对象,但在没有指定 null=True的情况下,select_related会使用inner join连表查询,这样可能会造成数据缺失(外键对象数据不存在的情况下)

eg:

author = models.ForeignKey(Author)
queryset = Book.objects.filter(*args).select_related('author')
print(queryset.query)

>>
SELECT * FROM Book INNER JOIN Author ON ..
将外键设为null=True,此时select_related会使用left outer join连表查询

eg:

author = models.ForeignKey(Author, null=True)
queryset = Book.objects.filter(*args).select_related('author')
print(queryset.query)

>>
SELECT * FROM Book LEFT OUT JOIN Author ON ..

如果外键对象必须写入且不能为null,又由于实际外键数据会被删除造成不一致的情况,读写可以分别使用不同的Model,同时也能解耦功能

还也可通过执行原生的sql实现left join连接
eg:
执行OrderIterm.objects.raw(sql_with_left_join)

猜你喜欢

转载自blog.csdn.net/pushiqiang/article/details/89235234