Django - 在查询集结果中订购 ManyToManyField

Django - order ManyToManyField within a queryset result

简化模型:

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)

假设我想 return 一个集合查询,但我希望 return 使用此查询集编辑的产品由 launch_date 订购,我该怎么做?

仅在产品发布日期添加 order_by 到查询中是行不通的,因为它只是对产品系列进行排序,但实际上并未对产品系列中的产品进行排序 Collections.objects.order_by('products__launch_date').all()

您可以使用 prefetch_related to optimise DB queries by fetching all related objects in a single query, if you add Prefetch 对象,您可以更改用于预取的查询集,包括排序

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

如果始终需要此排序,您也可以只向模型添加默认排序

class Product(models.Model):

    ...

    class Meta:
        ordering = ['launch_date']