我在连接和分页方面遇到了问题。我有 3 个模型:
我使用 Tag 关系来管理 Pads 和 Tag 之间的 ManyToMany 关系(使用 ManyToMany 字段的 through 属性)。
现在,当我在 Pad 和 Tag 表上进行连接时,它给了我这样的东西......
pad.name tag.name etc
---------------------------
pad1 tag1 ...
pad1 tag2 ...
pad2 tag3 ...
现在,当我根据这些结果创建一个 Paginator() 对象时,显然每页的项目数是错误的。我必须遍历所有结果并生成这样的字典......
[{name:'pad1', tags:['tag1', 'tag2']}, {name:'pad2' ....]
...并在此使用分页器来获取正确的页面。
这个问题的最佳方法是什么?我可以对当前页面上的每个 Pad 对象进行数据库查询以获取它的标签,但我想这迟早会杀死服务器(应该是高性能的)。
结果的内容也可能很长,遍历整个集合会消耗大量系统内存(或者会不会?启发我:))。
最佳答案
如果我理解正确,您应该在 Pad.objects.all() 上进行分页,然后使用 select_related在 TagRelation 对象上,两种方式都可以在一个(附加)查询中获取适当的标签,并在您的 View /模板中使用该数据。就像是:
thispagepadids = [o.id for o in mypageobject.object_list]
tagrels = TagRelation.objects.filter(pad__id__in=thispagetagids).select_related('tag','pad'))
(假设您在 mypageobject 中有您的页面对象)。
然后你可以在代码中获取任何给定 tagrel 的 pad 和 tag(使用 regroup 模板标签可能是最简单的方法)但数据库只执行一个(巨大的)查询,你的分页计数仍然正确。
请注意,我们必须执行 2 个查询,因为您不能直接在多对多字段上使用 select_related(请参阅 this ticket),但您可以使用它从中间 m2m 表中双向跟踪 FK。
关于sql - 加入 Django 的高效分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1861105/