如何用Django ORM直接查询指定workspace关联的Template对象QuerySet
解决方法
可以直接通过Django ORM的跨关联查询实现,无需额外的列表推导逻辑,写法如下:
template_qs = Template.objects.filter(document__shareddocument__workspace='1')
上述代码返回的直接是符合条件的Template对象的QuerySet,你可以直接对它做迭代、进一步过滤等操作。
原理说明
Django ORM支持用双下划线__跨外键关联进行查询,你场景下的关联路径为:Template -> 外键document关联到Document模型 -> Document反向关联到SharedDocument模型,所以通过document__shareddocument__workspace就能直接过滤出SharedDocument中workspace为指定值对应的所有Template。
补充优化点
- 如果存在同一个
Document对应多条同workspace的SharedDocument记录的情况,查询结果会出现重复的Template,可以加distinct()去重:template_qs = Template.objects.filter(document__shareddocument__workspace='1').distinct() - 你之前的写法里用了
template_set.get(),说明你的业务里每个Document最多关联一个Template,如果后续逻辑变更为一个Document可关联多个Template,这种直接过滤的写法也能正常返回所有符合条件的结果,不会像get()一样抛出MultipleObjectsReturned异常。 - 这种写法的查询效率比你原先的写法更高,只需要执行一次JOIN查询就能拿到结果,避免了额外的Python层迭代处理。
内容的提问来源于stack exchange,提问作者Oleg Klimenko
相关产品推荐
相关产品推荐

