Home > database >  Django - order ManyToManyField within a queryset result
Django - order ManyToManyField within a queryset result

Time:04-13

Simplified Models:

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)

Say I want to return a Collection query but I want products returned with this queryset to be ordered by launch_date, how would I do this?

Just adding order_by on products launch dates to the query does not work as that just orders the collections, but doesn't actually order the products within the collections Collections.objects.order_by('products__launch_date').all()

CodePudding user response:

You can use prefetch_related to optimise DB queries by fetching all related objects in a single query, if you add Prefetch objects to this you can change the queryset used to prefetch including the ordering

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

You could also just add default ordering to the model if this ordering is always desired

class Product(models.Model):

    ...

    class Meta:
        ordering = ['launch_date']
  • Related