{"id":6415,"date":"2023-01-13T02:09:21","date_gmt":"2023-01-13T02:09:21","guid":{"rendered":"https:\/\/www.pythontutorial.net\/?page_id=6415"},"modified":"2023-01-13T02:20:29","modified_gmt":"2023-01-13T02:20:29","slug":"django-order_by","status":"publish","type":"page","link":"https:\/\/www.pythontutorial.net\/django-tutorial\/django-order_by\/","title":{"rendered":"Django order_by"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn how to use Django <code>order_by<\/code> to sort rows by one or more columns in ascending or descending order.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='introduction-to-the-django-order_by-method'>Introduction to the Django order_by() method <a href=\"#introduction-to-the-django-order_by-method\" class=\"anchor\" id=\"introduction-to-the-django-order_by-method\" title=\"Anchor for Introduction to the Django order_by() method\">#<\/a><\/h2>\n\n\n\n<p>When defining a <a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-models\/\">model<\/a>, you can specify the default order of the results returned by a <code>QuerySet<\/code> by using the <code>ordering<\/code> option in the model&#8217;s <code>Meta<\/code> class.<\/p>\n\n\n\n<p>We&#8217;ll use the Employee model for the demonstration. The Employee model maps to the hr_employee table in the database:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"211\" height=\"211\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2023\/01\/django_orm_employee_table.png\" alt=\"\" class=\"wp-image-6379\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2023\/01\/django_orm_employee_table.png 211w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2023\/01\/django_orm_employee_table-150x150.png 150w\" sizes=\"auto, (max-width: 211px) 100vw, 211px\" \/><\/figure>\n\n\n\n<p>For example, to sort the employee by first and last names alphabetically, you can specify the <code>first_name<\/code> and <code>last_name<\/code> fields the <code>ordering<\/code> option in the <code>Meta<\/code> class as follows:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Employee<\/span><span class=\"hljs-params\">(models.Model)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\"># ...<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Meta<\/span>:<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>        ordering = &#91;<span class=\"hljs-string\">'first_name'<\/span>, <span class=\"hljs-string\">'last_name'<\/span>]\n<\/span><\/mark><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To sort the values in descending order, you add the <code>-<\/code> character in front of the field name. For example, the following uses the <code>ordering<\/code> option to sort the employees by first name in descending order and last name in ascending order:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Employee<\/span><span class=\"hljs-params\">(models.Model)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\"># ...<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Meta<\/span>:<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>        ordering = &#91;<span class=\"hljs-string\">'-first_name'<\/span>, <span class=\"hljs-string\">'last_name'<\/span>]\n<\/span><\/mark><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Also, you can use a query expression to make null values appear first or last in the sorted result:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.db.models <span class=\"hljs-keyword\">import<\/span> F\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Employee<\/span><span class=\"hljs-params\">(models.Model)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\"># ...<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Meta<\/span>:<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>        ordering = &#91;F(<span class=\"hljs-string\">'first_name'<\/span>).asc(nulls_last=<span class=\"hljs-literal\">True<\/span>)]\n<\/span><\/mark><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To override the default sort order, you use the <code>order_by()<\/code> method of a <code>QuerySet<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">order_by(*fields)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The following example uses the <code>order_by()<\/code> to sort employees by first name in ascending order:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><mark class='shcb-loc'><span><span class=\"hljs-meta\">&gt;&gt;&gt; <\/span>Employee.objects.all().order_by(<span class=\"hljs-string\">'first_name'<\/span>)             \n<\/span><\/mark><span class='shcb-loc'><span>SELECT <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"first_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"last_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"contact_id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"department_id\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  FROM <span class=\"hljs-string\">\"hr_employee\"<\/span>\n<\/span><\/span><mark class='shcb-loc'><span> ORDER BY <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"first_name\"<\/span> ASC\n<\/span><\/mark><span class='shcb-loc'><span> LIMIT <span class=\"hljs-number\">21<\/span>\n<\/span><\/span><span class='shcb-loc'><span>Execution time: <span class=\"hljs-number\">0.001034<\/span>s &#91;Database: default]\n<\/span><\/span><span class='shcb-loc'><span>&lt;QuerySet &#91;&lt;Employee: Aaron Pearson&gt;, &lt;Employee: Adam Crane&gt;, &lt;Employee: Adam Stewart&gt;, &lt;Employee: Adrienne Green&gt;, &lt;Employee: Alan Johnson&gt;, &lt;Employee: Alexa West&gt;, &lt;Employee: Alicia Wyatt&gt;, &lt;Employee: Amanda Benson&gt;, &lt;Employee: Amber Brown&gt;, &lt;Employee: Amy Lopez&gt;, &lt;Employee: Amy Lee&gt;, &lt;Employee: Andre Perez&gt;, &lt;Employee: \n<\/span><\/span><span class='shcb-loc'><span>Andrea Mcintosh&gt;, &lt;Employee: Andrew Guerra&gt;, &lt;Employee: Andrew Dixon&gt;, &lt;Employee: Ann Chang&gt;, &lt;Employee: Anne Odom&gt;, &lt;Employee: Anthony Welch&gt;, &lt;Employee: Anthony Fuentes&gt;, &lt;Employee: Ashley Brown&gt;, <span class=\"hljs-string\">'...(remaining elements truncated)...'<\/span>]&gt;\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Like the <code>ordering<\/code> option, you can use the <code>order_by()<\/code> method to sort the employee by the first name in descending order:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><mark class='shcb-loc'><span><span class=\"hljs-meta\">&gt;&gt;&gt; <\/span>Employee.objects.all().order_by(<span class=\"hljs-string\">'-first_name'<\/span>) \n<\/span><\/mark><span class='shcb-loc'><span>SELECT <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"first_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"last_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"contact_id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"department_id\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  FROM <span class=\"hljs-string\">\"hr_employee\"<\/span>\n<\/span><\/span><mark class='shcb-loc'><span> ORDER BY <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"first_name\"<\/span> DESC\n<\/span><\/mark><span class='shcb-loc'><span> LIMIT <span class=\"hljs-number\">21<\/span>\n<\/span><\/span><span class='shcb-loc'><span>Execution time: <span class=\"hljs-number\">0.000998<\/span>s &#91;Database: default]\n<\/span><\/span><span class='shcb-loc'><span>&lt;QuerySet &#91;&lt;Employee: William Wise&gt;, &lt;Employee: Wendy Reilly&gt;, &lt;Employee: Victoria Forbes&gt;, &lt;Employee: Victoria Schneider&gt;, &lt;Employee: Vicki Baker&gt;, &lt;Employee: Veronica Blackburn&gt;, &lt;Employee: Vanessa Allen&gt;, &lt;Employee: Valerie Nguyen&gt;, &lt;Employee: Tyler Coleman&gt;, &lt;Employee: Tyler Briggs&gt;, &lt;Employee: Troy Ashley&gt;, &lt;Employee: Travis Goodwin&gt;, &lt;Employee: Tony Jordan&gt;, &lt;Employee: Todd Evans&gt;, &lt;Employee: Timothy Dillon&gt;, &lt;Employee: Timothy Mckay&gt;, &lt;Employee: Timothy Williams&gt;, &lt;Employee: Timothy Lewis&gt;, &lt;Employee: Tiffany Holt&gt;, &lt;Employee: Tiffany Jackson&gt;, <span class=\"hljs-string\">'...(remaining elements truncated)...'<\/span>]&gt;\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code><code>order_by()<\/code><\/code> also allows you to sort the results by multiple fields. For example, the following uses the <code><code>order_by()<\/code><\/code> to sort employees by first and last name:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><mark class='shcb-loc'><span><span class=\"hljs-meta\">&gt;&gt;&gt; <\/span>Employee.objects.all().order_by(<span class=\"hljs-string\">'first_name'<\/span>,<span class=\"hljs-string\">'last_name'<\/span>)\n<\/span><\/mark><span class='shcb-loc'><span>SELECT <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"first_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"last_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"contact_id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"department_id\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  FROM <span class=\"hljs-string\">\"hr_employee\"<\/span>\n<\/span><\/span><mark class='shcb-loc'><span> ORDER BY <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"first_name\"<\/span> ASC,\n<\/span><\/mark><mark class='shcb-loc'><span>          <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"last_name\"<\/span> ASC\n<\/span><\/mark><span class='shcb-loc'><span> LIMIT <span class=\"hljs-number\">21<\/span>\n<\/span><\/span><span class='shcb-loc'><span>Execution time: <span class=\"hljs-number\">0.000998<\/span>s &#91;Database: default]\n<\/span><\/span><span class='shcb-loc'><span>&lt;QuerySet &#91;&lt;Employee: Aaron Pearson&gt;, &lt;Employee: Adam Crane&gt;, &lt;Employee: Adam Stewart&gt;, &lt;Employee: Adrienne Green&gt;, &lt;Employee: Alan Johnson&gt;, &lt;Employee: Alexa West&gt;, &lt;Employee: Alicia Wyatt&gt;, &lt;Employee: Amanda Benson&gt;, &lt;Employee: Amber Brown&gt;, &lt;Employee: Amy Lee&gt;, &lt;Employee: Amy Lopez&gt;, &lt;Employee: Andre Perez&gt;, &lt;Employee: \n<\/span><\/span><span class='shcb-loc'><span>Andrea Mcintosh&gt;, &lt;Employee: Andrew Dixon&gt;, &lt;Employee: Andrew Guerra&gt;, &lt;Employee: Ann Chang&gt;, &lt;Employee: Anne Odom&gt;, &lt;Employee: Anthony Fuentes&gt;, &lt;Employee: Anthony Welch&gt;, &lt;Employee: Ashley Brown&gt;, <span class=\"hljs-string\">'...(remaining elements truncated)...'<\/span>]&gt;\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To order randomly, you can use a question mark <code>?<\/code> like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><mark class='shcb-loc'><span><span class=\"hljs-meta\">&gt;&gt;&gt; <\/span>Employee.objects.all().order_by(<span class=\"hljs-string\">'?'<\/span>)                      \n<\/span><\/mark><span class='shcb-loc'><span>SELECT <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"first_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"last_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"contact_id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"department_id\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  FROM <span class=\"hljs-string\">\"hr_employee\"<\/span>\n<\/span><\/span><mark class='shcb-loc'><span> ORDER BY RANDOM() ASC\n<\/span><\/mark><span class='shcb-loc'><span> LIMIT <span class=\"hljs-number\">21<\/span>\n<\/span><\/span><span class='shcb-loc'><span>Execution time: <span class=\"hljs-number\">0.010370<\/span>s &#91;Database: default]\n<\/span><\/span><span class='shcb-loc'><span>&lt;QuerySet &#91;&lt;Employee: Daniel Meyer&gt;, &lt;Employee: Todd Evans&gt;, &lt;Employee: Roger Robinson&gt;, &lt;Employee: Dwayne Williams&gt;, &lt;Employee: Michael Murphy&gt;, &lt;Employee: Daniel Friedman&gt;, &lt;Employee: Claudia Aguilar&gt;, &lt;Employee: Craig Hunter&gt;, &lt;Employee: Amanda Benson&gt;, &lt;Employee: Renee Wright&gt;, &lt;Employee: Wendy Reilly&gt;, &lt;Employee: Jamie Jackson&gt;, &lt;Employee: Philip Jones&gt;, &lt;Employee: Kelly Stewart&gt;, &lt;Employee: Barbara Vincent&gt;, &lt;Employee: Drew Gonzalez&gt;, &lt;Employee: Derek Owens&gt;, &lt;Employee: Lauren Mcdonald&gt;, &lt;Employee: Perry Rodriguez&gt;, &lt;Employee: Matthew Hernandez&gt;, <span class=\"hljs-string\">'...(remaining elements truncated)...'<\/span>]&gt;\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>order_by<\/code>(&#8216;?&#8217;) maybe slow and expensive, depending on the database that you&#8217;re using. The above-generated <code>SQL<\/code> is from PostgreSQL. Other databases may have different implementations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='ordering-by-related-models'>Ordering by related models <a href=\"#ordering-by-related-models\" class=\"anchor\" id=\"ordering-by-related-models\" title=\"Anchor for Ordering by related models\">#<\/a><\/h2>\n\n\n\n<p>The <code>order_by()<\/code> allows you to order by a field in a related model. The syntax of the field is the related model, followed by double underscores and the field name:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">Entity.objects.order_by(related_model__field_name)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>We&#8217;ll use the Employee and Department models for the demonstration. The Employee and Department models map to the <code>hr_employee<\/code> and <code>hr_department<\/code> tables:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"374\" height=\"144\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2023\/01\/django_orm_employee_department.png\" alt=\"\" class=\"wp-image-6416\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2023\/01\/django_orm_employee_department.png 374w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2023\/01\/django_orm_employee_department-300x116.png 300w\" sizes=\"auto, (max-width: 374px) 100vw, 374px\" \/><figcaption class=\"wp-element-caption\"><br><\/figcaption><\/figure>\n\n\n\n<p>The following example uses the <code>order_by()<\/code> to sort employees by their department names:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><mark class='shcb-loc'><span><span class=\"hljs-meta\">&gt;&gt;&gt; <\/span>Employee.objects.all().order_by(<span class=\"hljs-string\">'department__name'<\/span>)\n<\/span><\/mark><span class='shcb-loc'><span>SELECT <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"first_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"last_name\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"contact_id\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"department_id\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  FROM <span class=\"hljs-string\">\"hr_employee\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span> INNER JOIN <span class=\"hljs-string\">\"hr_department\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    ON (<span class=\"hljs-string\">\"hr_employee\"<\/span>.<span class=\"hljs-string\">\"department_id\"<\/span> = <span class=\"hljs-string\">\"hr_department\"<\/span>.<span class=\"hljs-string\">\"id\"<\/span>)\n<\/span><\/span><mark class='shcb-loc'><span> ORDER BY <span class=\"hljs-string\">\"hr_department\"<\/span>.<span class=\"hljs-string\">\"name\"<\/span> ASC\n<\/span><\/mark><span class='shcb-loc'><span> LIMIT <span class=\"hljs-number\">21<\/span>\n<\/span><\/span><span class='shcb-loc'><span>Execution time: <span class=\"hljs-number\">0.037173<\/span>s &#91;Database: default]\n<\/span><\/span><span class='shcb-loc'><span>&lt;QuerySet &#91;&lt;Employee: Brandy Morris&gt;, &lt;Employee: Jay Carlson&gt;, &lt;Employee: Jessica Lewis&gt;, &lt;Employee: Amanda Benson&gt;, &lt;Employee: Jacqueline Weaver&gt;, &lt;Employee: Patrick Griffith&gt;, &lt;Employee: Adam Stewart&gt;, &lt;Employee: Tiffany Holt&gt;, &lt;Employee: Amber Brown&gt;, &lt;Employee: Martin Raymond&gt;, &lt;Employee: Kyle Pratt&gt;, &lt;Employee: Cheryl Thomas&gt;, &lt;Employee: Linda Garcia&gt;, &lt;Employee: Jeanette Hendrix&gt;, &lt;Employee: Kimberly Gallagher&gt;, &lt;Employee: Kelly Stewart&gt;, &lt;Employee: Alan Johnson&gt;, &lt;Employee: \n<\/span><\/span><span class='shcb-loc'><span>William Wise&gt;, &lt;Employee: Debra Webb&gt;, &lt;Employee: Ryan Garcia&gt;, <span class=\"hljs-string\">'...(remaining elements truncated)...'<\/span>]&gt;\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The generated SQL shows that when ordering by a field in a related model, Django uses a join that joins the table of the current model (<code>Employee<\/code>) with the table of the related model (<code>Department<\/code>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='summary'>Summary <a href=\"#summary\" class=\"anchor\" id=\"summary\" title=\"Anchor for Summary\">#<\/a><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use Django <code>order_by()<\/code> to sort data by one or more fields in ascending or descending order.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"6415\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-order_by\/\"\n\t\t\t\tdata-post-title=\"Django order_by\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"6415\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-order_by\/\"\n\t\t\t\tdata-post-title=\"Django order_by\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\t\t\t<input type=\"button\" name=\"wth-submit\" class=\"wth-btn wth-btn-submit\" id=\"wth-submit\" \/>\n\t\t\t<input type=\"button\" class=\"wth-btn wth-btn-cancel\" value=\"Cancel\" \/>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summary: in this tutorial, you&#8217;ll learn how to use Django order_by to sort rows by one or more columns in ascending or descending order. Introduction to the Django order_by() method # When defining a model, you can specify the default order of the results returned by a QuerySet by using the ordering option in the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":5531,"menu_order":29,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6415","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/6415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/comments?post=6415"}],"version-history":[{"count":0,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/6415\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/5531"}],"wp:attachment":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/media?parent=6415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}