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']