Django Tutorial: `order_by()`, `values()`, `values_list()`

beginner
22 min

Django Tutorial: order_by(), values(), values_list()

Welcome to CodeYourCraft's comprehensive guide on using Django's order_by(), values(), and values_list() functions! Let's dive right in and learn these powerful tools together.

Getting Started

Before we begin, make sure you have Django installed and a project set up. If you need help getting started, check out our Django Tutorial.

order_by()

order_by() allows you to sort queryset results in ascending or descending order based on a field.

python
from django.db.models import OrderBy # Ascending order queryset.order_by('field_name') # Descending order queryset.order_by('-field_name')

πŸ’‘ Pro Tip: If you want to sort by multiple fields, use OrderBy and list the fields in the order you want them sorted.

python
queryset.order_by(OrderBy('field1', 'field2'))

values()

values() returns a queryset of dictionaries, where each dictionary contains the values of the specified fields from the queryset's objects.

python
# Returns a queryset of dictionaries with 'field1' and 'field2' values queryset.values('field1', 'field2')

πŸ“ Note: By default, values() returns only unique values, excluding duplicates.

values_list()

values_list() returns a queryset of tuples, where each tuple contains the values of the specified fields from the queryset's objects.

python
# Returns a queryset of tuples with 'field1' and 'field2' values queryset.values_list('field1', 'field2')

πŸ“ Note: Unlike values(), values_list() does not exclude duplicates by default.

Practical Examples

Let's consider a simple blog application with the following models:

python
from django.db import models class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE) author = models.CharField(max_length=50) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True)

Using order_by()

python
# Get posts ordered by creation date in descending order posts = Post.objects.order_by('-created_at') # Get comments ordered by author in ascending order comments = Comment.objects.order_by('author')

Using values() and values_list()

python
# Get post titles and creation dates as a queryset of dictionaries post_titles_and_dates = Post.objects.values('title', 'created_at') # Get post IDs and titles as a queryset of tuples post_ids_and_titles = Post.objects.values_list('id', 'title')

Quiz

Quick Quiz
Question 1 of 1

Which function do you use to sort queryset results in descending order based on a field?

Conclusion

Mastering order_by(), values(), and values_list() in Django allows you to manipulate and display your data more effectively, making your applications more practical and user-friendly. Happy coding!