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']
简化模型:
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']