首页 > 解决方案 > Django order by a field from a related model 返回重复的对象

问题描述

我有这两个模型:

class Product(models.Model):
    name = models.CharField(max_length=100)
    ...

class ProductPack(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    ...
    price = models.PositiveIntegerField(default=0)

我有一个产品模型的查询集:

products = Product.objects.all()
# <ProductQuerySet [<Product: first product>]>

我想通过“productpack__price”订购产品查询集。所以我试图通过这段代码来做到这一点:

qs = products.order_by("productpack__price")

这部分工作正常。但是有一个问题。对于产品中的每个对象,此代码将对象返回到它们在 ProductPack 中拥有的外键计数。像这样:

qs
<ProductQuerySet [<Product: first product>, <Product: first product>, <Product: first product>]>

如何解决这个问题。你有什么建议吗?

标签: pythondjangodjango-models

解决方案


当你 order byproductpacks时,如果 aproduct与 multiple 相关productpacks,则返回queryset一次 for each productpack

这可以是您的解决方案:

from django.db.models import Max  


products = Product.objects.annotate(
    price=Max("productpack__price")
).order_by("price")

推荐阅读