代码之家  ›  专栏  ›  技术社区  ›  Sethen xQbert

django获取外键对象

  •  1
  • Sethen xQbert  · 技术社区  · 6 年前

    我来自.net core,我很好奇django是否有类似于.net core的预测。例如,我可以在.NET核心模型中描述一个关系,然后查询它。所以,如果 Articles 可以有 Author 我可以这样做:

    var articles = dbContext.Where(article.ID == id).Inclue(a => a.author);

    我要回来的是那些附有作者的文章。

    在Django有类似的吗?如何在django中加载模型中描述的相关数据?

    2 回复  |  直到 6 年前
        1
  •  2
  •   willeM_ Van Onsem    6 年前

    对。您编写的查询或多或少相当于:

    Article.objects.filter(id=some_id).prefetch_related('author')
    

    或:

    Article.objects.filter(id=some_id).select_related('author')
    

    select_related 对战 prefetch_related

    如果 Author S是有限的,或者是一对一的关系。万一你拉了很多 Article 还有几个 文章 S映射到 相同的 作者 ,通常最好使用 与预取相关 :这将首先查找 作者 标识符,执行一个唯一性过滤器,然后将它们提取到内存中。

    如果多个相同 作者 写一篇文章(所以 一对多 多对多 关系)。因为那意味着如果我们 JOIN 在数据库级别,我们按照 作者 是谁写的那篇文章,我们重复每一次 作者 按数量 文章 他们写的。对于这样的集合,我们通常希望避免这种“乘法”行为。所以在那种情况下 与预取相关 将有 线性行为 :首先获取相关的 文章 S,接下来获取相关的 作者 S.

    延迟加载相关对象

    但实际上你不需要 与预取相关 就一个例子来说。如果你载入一篇文章,你可以简单地使用 some_article.author . 如果 作者 实例尚未加载,django将执行另一个查询来获取相关的 作者 实例。

    因此django可以加载与 懒惰的 方式:只需加载 文章 如果你把它记下来,如果你以后需要 作者 ,或者 Journal ,或者 .editor 学报 (例如 作者 django每次都会创建一个新的查询并加载相关对象。如果您想处理 文章 S批处理, 选择相关的 prefect_related 是可取的,因为它们将导致有限数量的查询来获取所有相关对象,而不是每个相关实例一个查询。

    如果经常需要获取零个或最多几个相关实例(例如,因为它依赖于 文章 我们是否真的对 作者 毕竟)。

        2
  •  3
  •   dfundako    6 年前

    听起来你在找 select_related . 这将基于在模型中创建FK关系的方式遍历FK关系。