sql - 加入 Django 的高效分页

标签 sql django join pagination

我在连接和分页方面遇到了问题。我有 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/

    相关文章:

    java - 如果其他列相同,则带有连接行项目的 SQL 结果表。帮助?

    sql - 比较 Ubuntu/Linux 上的 ms-sql 数据库架构

    sql - 如果一周中超过 x 天则返回

    sql - '6/1/201 2' < ' 6/1/2012 0 :00:00. 000' = 真?

    python - 如何在 django admin 外键下拉列表中更改显示文本

    c# - LINQ 中多个左连接的正确语法?

    django - 检查 Django 生成的查询

    sql-server - 使用 MyModel.objects.raw() 基于 SQL 表值函数的 Django 模型

    sql - 根据条件连接不同的表

    mysql - 连接查询优化