{"id":304133,"date":"2020-05-24T03:00:18","date_gmt":"2020-05-24T03:00:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=304133"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=304133","title":{"rendered":"Django ORM | \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/503526\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2v\/by\/tw\/2vbytwtkrzwrodjiax39s6leu5o.png\"><br \/>  <b>Django ORM<\/b> (Object Relational Mapping) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043c\u043e\u0449\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Django. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043e\u0434 Python, \u0430 \u043d\u0435 SQL.<\/p>\n<p>  \u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u043f\u0438\u0448\u0443 \u0442\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c:<\/p>\n<pre><code class=\"python\">from django.db import models  class Blog(models.Model):     name = models.CharField(max_length=250)     url = models.URLField()      def __str__(self):         return self.name  class Author(models.Model):     name = models.CharField(max_length=250)      def __str__(self):         return self.name  class Post(models.Model):     title = models.CharField(max_length=250)     content = models.TextField()     published = models.BooleanField(default=True)     blog = models.ForeignKey(Blog, on_delete=models.CASCADE)     authors = models.ManyToManyField(Author, related_name=&quot;posts&quot;) <\/code><\/pre>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u042f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <b><a href=\"https:\/\/github.com\/django-extensions\/django-extensions\" rel=\"nofollow\">django-extentions<\/a><\/b>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044e \u0441 <\/p>\n<pre><code class=\"bash\">python manage.py shell_plus --print-sql <\/code><\/pre>\n<p>  \u0418 \u0442\u0430\u043a \u043d\u0430\u0447\u043d\u0435\u043c:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; post = Post.objects.all() &gt;&gt;&gt; post SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot;  LIMIT 21 Execution time: 0.000172s [Database: default] &lt;QuerySet [&lt;Post: Post object (1)&gt;]&gt; <\/code><\/pre>\n<p>  <b>1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 <b>ForeignKey ids<\/b><\/b>  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; Post.objects.first().blog.id SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot;  ORDER BY &quot;blog_post&quot;.&quot;id&quot; ASC  LIMIT 1 Execution time: 0.000225s [Database: default] SELECT &quot;blog_blog&quot;.&quot;id&quot;,        &quot;blog_blog&quot;.&quot;name&quot;,        &quot;blog_blog&quot;.&quot;url&quot;   FROM &quot;blog_blog&quot;  WHERE &quot;blog_blog&quot;.&quot;id&quot; = 1  LIMIT 21 Execution time: 0.000144s [Database: default] 1 <\/code><\/pre>\n<p>  \u0410 \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 1 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0411\u0414:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; Post.objects.first().blog_id SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot;  ORDER BY &quot;blog_post&quot;.&quot;id&quot; ASC  LIMIT 1 Execution time: 0.000155s [Database: default] 1 <\/code><\/pre>\n<p>  <b>2. OneToMany Relations<\/b><br \/>  \u0415\u0441\u043b\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c OneToMany \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ForeignKey \u043f\u043e\u043b\u044f \u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; post = Post.objects.get(id=1) SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot;  WHERE &quot;blog_post&quot;.&quot;id&quot; = 1  LIMIT 21 Execution time: 0.000161s [Database: default] <\/code><\/pre>\n<p>  \u0418 \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0431\u043b\u043e\u0433\u0430 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u0441\u0442\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; post.blog SELECT &quot;blog_blog&quot;.&quot;id&quot;,        &quot;blog_blog&quot;.&quot;name&quot;,        &quot;blog_blog&quot;.&quot;url&quot;   FROM &quot;blog_blog&quot;  WHERE &quot;blog_blog&quot;.&quot;id&quot; = 1  LIMIT 21 Execution time: 0.000211s [Database: default] &lt;Blog: Django tutorials&gt; <\/code><\/pre>\n<p>  \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u044d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0431\u043b\u043e\u0433\u0430. \u0422\u0430\u043a \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <b>select_related<\/b>, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0448 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; post = Post.objects.select_related(&quot;blog&quot;).get(id=1) SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;,        &quot;blog_blog&quot;.&quot;id&quot;,        &quot;blog_blog&quot;.&quot;name&quot;,        &quot;blog_blog&quot;.&quot;url&quot;   FROM &quot;blog_post&quot;  INNER JOIN &quot;blog_blog&quot;     ON (&quot;blog_post&quot;.&quot;blog_id&quot; = &quot;blog_blog&quot;.&quot;id&quot;)  WHERE &quot;blog_post&quot;.&quot;id&quot; = 1  LIMIT 21 Execution time: 0.000159s [Database: default] <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e Django \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 JOIN \u0441\u0435\u0439\u0447\u0430\u0441! \u0418 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u043d\u044c\u0448\u0435. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u0435\u043f\u0435\u0440\u044c post.blog \u0431\u0443\u0434\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d!  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; post.blog &lt;Blog: Django tutorials&gt; <\/code><\/pre>\n<p>  <b>select_related<\/b> \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 QurySets:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; posts = Post.objects.select_related(&quot;blog&quot;).all() &gt;&gt;&gt; for post in posts: ...     post.blog ... SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;,        &quot;blog_blog&quot;.&quot;id&quot;,        &quot;blog_blog&quot;.&quot;name&quot;,        &quot;blog_blog&quot;.&quot;url&quot;   FROM &quot;blog_post&quot;  INNER JOIN &quot;blog_blog&quot;     ON (&quot;blog_post&quot;.&quot;blog_id&quot; = &quot;blog_blog&quot;.&quot;id&quot;) Execution time: 0.000241s [Database: default] &lt;Blog: Django tutorials&gt; <\/code><\/pre>\n<p>  <b>3. ManyToMany Relations:<\/b><br \/>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u0441\u0442\u043e\u0432 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; for post in Post.objects.all(): ...     post.authors.all() ... SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot; Execution time: 0.000242s [Database: default] SELECT &quot;blog_author&quot;.&quot;id&quot;,        &quot;blog_author&quot;.&quot;name&quot;   FROM &quot;blog_author&quot;  INNER JOIN &quot;blog_post_authors&quot;     ON (&quot;blog_author&quot;.&quot;id&quot; = &quot;blog_post_authors&quot;.&quot;author_id&quot;)  WHERE &quot;blog_post_authors&quot;.&quot;post_id&quot; = 1  LIMIT 21 Execution time: 0.000125s [Database: default] &lt;QuerySet [&lt;Author: Dmytro Parfeniuk&gt;, &lt;Author: Will Vincent&gt;, &lt;Author: Guido van Rossum&gt;]&gt; SELECT &quot;blog_author&quot;.&quot;id&quot;,        &quot;blog_author&quot;.&quot;name&quot;   FROM &quot;blog_author&quot;  INNER JOIN &quot;blog_post_authors&quot;     ON (&quot;blog_author&quot;.&quot;id&quot; = &quot;blog_post_authors&quot;.&quot;author_id&quot;)  WHERE &quot;blog_post_authors&quot;.&quot;post_id&quot; = 2  LIMIT 21 Execution time: 0.000109s [Database: default] &lt;QuerySet [&lt;Author: Dmytro Parfeniuk&gt;, &lt;Author: Will Vincent&gt;]&gt; <\/code><\/pre>\n<p>  \u041f\u043e\u0445\u043e\u0436\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u0441\u0442\u0430. \u041f\u043e \u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <b>prefetch_related<\/b>. \u042d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 <b>select_related <\/b>\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441 ManyToMany Fields:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; for post in Post.objects.prefetch_related(&quot;authors&quot;).all(): ...     post.authors.all() ... SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot; Execution time: 0.000300s [Database: default] SELECT (&quot;blog_post_authors&quot;.&quot;post_id&quot;) AS &quot;_prefetch_related_val_post_id&quot;,        &quot;blog_author&quot;.&quot;id&quot;,        &quot;blog_author&quot;.&quot;name&quot;   FROM &quot;blog_author&quot;  INNER JOIN &quot;blog_post_authors&quot;     ON (&quot;blog_author&quot;.&quot;id&quot; = &quot;blog_post_authors&quot;.&quot;author_id&quot;)  WHERE &quot;blog_post_authors&quot;.&quot;post_id&quot; IN (1, 2) Execution time: 0.000379s [Database: default] &lt;QuerySet [&lt;Author: Dmytro Parfeniuk&gt;, &lt;Author: Will Vincent&gt;, &lt;Author: Guido van Rossum&gt;]&gt; &lt;QuerySet [&lt;Author: Dmytro Parfeniuk&gt;, &lt;Author: Will Vincent&gt;]&gt; <\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e??? \u041c\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 2 \u0434\u043e 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 2 QuerySet-a!<\/p>\n<p>  <b>4. Prefetch object<\/b><br \/>  <b>prefetch_related <\/b>\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\u044e \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0435\u0441\u043b\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e Django \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 <b>posts<\/b>, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043d\u0435 \u0431\u044b\u043b\u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u044b, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u044b \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u0418 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043c:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; authors = Author.objects.prefetch_related(&quot;posts&quot;).all() &gt;&gt;&gt; for author in authors: ...     print(author.posts.filter(published=True)) ... SELECT &quot;blog_author&quot;.&quot;id&quot;,        &quot;blog_author&quot;.&quot;name&quot;   FROM &quot;blog_author&quot; Execution time: 0.000580s [Database: default] SELECT (&quot;blog_post_authors&quot;.&quot;author_id&quot;) AS &quot;_prefetch_related_val_author_id&quot;,        &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;published&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot;  INNER JOIN &quot;blog_post_authors&quot;     ON (&quot;blog_post&quot;.&quot;id&quot; = &quot;blog_post_authors&quot;.&quot;post_id&quot;)  WHERE &quot;blog_post_authors&quot;.&quot;author_id&quot; IN (1, 2, 3) Execution time: 0.000759s [Database: default] SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;published&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot;  INNER JOIN &quot;blog_post_authors&quot;     ON (&quot;blog_post&quot;.&quot;id&quot; = &quot;blog_post_authors&quot;.&quot;post_id&quot;)  WHERE (&quot;blog_post_authors&quot;.&quot;author_id&quot; = 1 AND &quot;blog_post&quot;.&quot;published&quot; = 1)  LIMIT 21 Execution time: 0.000299s [Database: default] &lt;QuerySet [&lt;Post: Post object (1)&gt;, &lt;Post: Post object (2)&gt;]&gt; SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;published&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot;  INNER JOIN &quot;blog_post_authors&quot;     ON (&quot;blog_post&quot;.&quot;id&quot; = &quot;blog_post_authors&quot;.&quot;post_id&quot;)  WHERE (&quot;blog_post_authors&quot;.&quot;author_id&quot; = 2 AND &quot;blog_post&quot;.&quot;published&quot; = 1)  LIMIT 21 Execution time: 0.000336s [Database: default] &lt;QuerySet [&lt;Post: Post object (1)&gt;, &lt;Post: Post object (2)&gt;]&gt; SELECT &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;published&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot;  INNER JOIN &quot;blog_post_authors&quot;     ON (&quot;blog_post&quot;.&quot;id&quot; = &quot;blog_post_authors&quot;.&quot;post_id&quot;)  WHERE (&quot;blog_post_authors&quot;.&quot;author_id&quot; = 3 AND &quot;blog_post&quot;.&quot;published&quot; = 1)  LIMIT 21 Execution time: 0.000412s [Database: default] &lt;QuerySet [&lt;Post: Post object (1)&gt;]&gt; <\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 <b>prefetch_related<\/b>, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u043c\u044b \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0438 \u0435\u0433\u043e. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <b>Prefetch<\/b>:  <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; authors = Author.objects.prefetch_related( ...     Prefetch( ...             &quot;posts&quot;, ...             queryset=Post.objects.filter(published=True), ...             to_attr=&quot;published_posts&quot;, ...     ) ... ) &gt;&gt;&gt; for author in authors: ...     print(author.published_posts) ... SELECT &quot;blog_author&quot;.&quot;id&quot;,        &quot;blog_author&quot;.&quot;name&quot;   FROM &quot;blog_author&quot; Execution time: 0.000183s [Database: default] SELECT (&quot;blog_post_authors&quot;.&quot;author_id&quot;) AS &quot;_prefetch_related_val_author_id&quot;,        &quot;blog_post&quot;.&quot;id&quot;,        &quot;blog_post&quot;.&quot;title&quot;,        &quot;blog_post&quot;.&quot;content&quot;,        &quot;blog_post&quot;.&quot;published&quot;,        &quot;blog_post&quot;.&quot;blog_id&quot;   FROM &quot;blog_post&quot;  INNER JOIN &quot;blog_post_authors&quot;     ON (&quot;blog_post&quot;.&quot;id&quot; = &quot;blog_post_authors&quot;.&quot;post_id&quot;)  WHERE (&quot;blog_post&quot;.&quot;published&quot; = 1 AND &quot;blog_post_authors&quot;.&quot;author_id&quot; IN (1, 2, 3)) Execution time: 0.000404s [Database: default] [&lt;Post: Post object (1)&gt;, &lt;Post: Post object (2)&gt;] [&lt;Post: Post object (1)&gt;, &lt;Post: Post object (2)&gt;] [&lt;Post: Post object (1)&gt;] <\/code><\/pre>\n<p>  \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043d\u043e\u0432\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435. \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 2 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/503526\/\"> https:\/\/habr.com\/ru\/post\/503526\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/503526\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2v\/by\/tw\/2vbytwtkrzwrodjiax39s6leu5o.png\"><br \/>  <b>Django ORM<\/b> (Object Relational Mapping) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043c\u043e\u0449\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Django. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043e\u0434 Python, \u0430 \u043d\u0435 SQL.<\/p>\n<p>  \u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u043f\u0438\u0448\u0443 \u0442\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c:<\/p>\n<pre><code class=\"python\">from django.db import models  class Blog(models.Model):     name = models.CharField(max_length=250)     url = models.URLField()      def __str__(self):         return self.name  class Author(models.Model):     name = models.CharField(max_length=250)      def __str__(self):         return self.name  class Post(models.Model):     title = models.CharField(max_length=250)     content = models.TextField()     published = models.BooleanField(default=True)     blog = models.ForeignKey(Blog, on_delete=models.CASCADE)     authors = models.ManyToManyField(Author, related_name=&quot;posts&quot;) <\/code><\/pre>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-304133","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304133","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=304133"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304133\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=304133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=304133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=304133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}