Py学习  »  Django

Django-在queryset结果中订购多个ManyToManyField

Edward Fu • 2 年前 • 634 次点击  

简化模型:

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)

假设我想返回一个集合查询,但我希望使用此查询集返回的产品由 launch_date ,我该怎么做?

只是加上 order_by 在产品发布日期,查询不起作用,因为它只是订购集合,但实际上并不订购集合中的产品 Collections.objects.order_by('products__launch_date').all()

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131743
 
634 次点击  
文章 [ 1 ]  |  最新文章 2 年前
Iain Shelvington
Reply   •   1 楼
Iain Shelvington    2 年前

你可以用 prefetch_related 通过在单个查询中获取所有相关对象来优化DB查询,如果添加 Prefetch 对象,您可以更改用于预取的查询集,包括排序

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

如果总是需要这种排序,也可以只向模型中添加默认排序

class Product(models.Model):

    ...

    class Meta:
        ordering = ['launch_date']