Как отсортировать QuerySet по значению ForeignKey?

Для сортировки QuerySet по значению ForeignKey в Django можно использовать атрибут order_by() вместе с именем связанного поля.

Возьмем в качестве примера две модели - Post и Category:

class Category(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Post(models.Model):
    title = models.CharField(max_length=255)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

Допустим, у нас есть несколько записей типа Post и мы хотим отсортировать их по значению category. Для этого мы можем использовать метод order_by() в сочетании с именем поля связанной модели:

sorted_posts = Post.objects.order_by('category__name')

Здесь мы указываем имя связанного поля category с помощью двойного подчеркивания (__) и затем имя поля, по которому хотим выполнить сортировку (name). Таким образом, результаты будут отсортированы по значению поля name в связанной модели Category.

Если вам нужно отсортировать записи в обратном порядке, вы можете добавить - перед имени поля:

sorted_posts = Post.objects.order_by('-category__name')

Теперь результаты будут отсортированы в обратном порядке по значению поля name в связанной модели Category.

Помимо этого, вы можете сортировать QuerySet по нескольким полям. Например, чтобы сначала сортировать по category, а затем по другому полю date_created, вы можете использовать следующий код:

sorted_posts = Post.objects.order_by('category__name', 'date_created')

Это отсортирует записи сначала по значению name в связанной модели Category, а затем по значению поля date_created.