Django - упорядочивание ManyToManyField внутри результата кверисета

Упрощенные модели:

Class Product(models.Model):
    name = models.CharField(max_length=250)
    launch_date = models.DateField(blank=True)

Class Collection(models.Model):
    name = models.CharField(max_length=250)
    products = models.ManyToManyField(Product, related_name="collections", blank=True)

Допустим, я хочу вернуть запрос Collection, но хочу, чтобы продукты, возвращаемые этим набором запросов, были упорядочены по launch_date, как мне это сделать?

Простое добавление order_by в запрос даты запуска продуктов не работает, так как это только упорядочивает коллекции, но не упорядочивает продукты в коллекциях. Collections.objects.order_by('products__launch_date').all()

Вы можете использовать prefetch_related для оптимизации запросов к БД путем получения всех связанных объектов в одном запросе. Если вы добавите к этому объекты Prefetch, вы можете изменить набор запросов, используемый для предварительной выборки, включая упорядочивание

qs = Collection.objects.prefetch_related(
    Prefetch('products', queryset=Product.objects.order_by('launch_date'))
)

Вы также можете просто добавить упорядочивание по умолчанию в модель, если это упорядочивание всегда желательно

class Product(models.Model):

    ...

    class Meta:
        ordering = ['launch_date']
Вернуться на верх