django - 如何避免在 Django 中进行 n+1 选择?

标签 django orm join

我有一个非常简单的数据模型,视频和评论之间存在一对多的关系

class Video(models.Model):
    url = models.URLField(unique=True)
    .....

class Comment(models.Model):
    title = models.CharField(max_length=128)
    video = models.ForeignKey('Video')
        .....

我想查询视频并获取整个对象图(带有所有评论的视频)。查看 sql,我看到它做了两个选择,一个用于视频,另一个用于评论。我该如何避免?我想加入并立即获取所有内容。

可以用 django 做到这一点吗?

最佳答案

对于外键,您可以使用 selected_related() :

Comment.objects.select_related('video').all()

它只会生成一个查询,为您收集评论和视频。

对于更复杂的事情(例如 M2M),您需要一个外部应用程序,例如 unjoinify进行优化,但它使用 SQL 查询将它们放回对象中。

如果你对此感到不舒服(我是),你有一些选择:
  • django-queryset-transform :不是完整的解决方案,但有帮助
  • django-batch-select :大约是 select_related适用于 M2M 和反向关系。
  • 关于django - 如何避免在 Django 中进行 n+1 选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6388668/

    相关文章:

    python - 添加额外的参数到serializer.data

    jquery - 如何在django中使用ajax,传递模型对象并将其存储在数据库中而不刷新页面?

    java - 从 Hibernate 3 迁移到 4 会减慢启动速度

    php - CakePHP - 使用 JOIN 有效地搜索 3 个表

    django - 添加索引 (db_index=True)

    python - tzlocal 为我提供 UTC 作为我的本地时区

    hibernate 外键映射多对一

    ios - DBAccess:获取任何一个属性值的数组

    mysql - 在复杂连接中获取不同的数据

    java - 我怎样才能停止我的过程,直到上一步结束