1

我有以下模型(简化):

class Category(models.model):
    # ...

class Product(models.model):
    # ...

class ProductCategory(models.Model):
    product = models.ForeignKey(Product)
    category = models.ForeignKey(Category)
    # ...

class ProductImage(models.Model):
    product = models.ForeignKey(Product)
    image = models.ImageField(upload_to=product_image_path)
    sort_order = models.PositiveIntegerField(default=100)
    # ...

我想构建一个查询,该查询将获取与特定类别关联的所有产品。我想在查询集中仅包含许多相关图像中的一个(最低的图像),sort_order以便单个查询获取显示类别中所有产品所需的所有数据。

在原始 SQL 中,我可能会使用这样的GROUP BY东西:

SELECT * FROM catalog_product p 
LEFT JOIN catalog_productcategory c ON (p.id = c.product_id) 
LEFT JOIN catalog_productimage i ON (p.id = i.product_id) 
WHERE c.category_id=2 
GROUP BY p.id HAVING i.sort_order = MIN(sort_order)

这可以在不使用原始查询的情况下完成吗?

编辑- 我应该注意到我尝试过的......

# inside Category model...
products = Product.objects.filter(productcategory__category=self) \
            .annotate(Min('productimage__sort_order'))

虽然这个查询确实如此GROUP BY,但我看不到任何方法来(a)ProductImage.image进入 QuerySet,例如。HAVING条款。我正在有效地尝试从特定的 ProductImage 实例向 Product 实例(或 QuerySet)动态添加一个字段。这可能不是使用 Django 的方法。

4

2 回答 2

0

这不是一个原始查询,但也不是完全公共的 api。

您可以在评估之前将 group by 子句添加到查询集:

qs = Product.objects.filter(some__foreign__key__join=something)
qs.group_by = 'some_field'
results = list(qs)

但请注意:这取决于 db 后端的行为不同。

于 2012-10-04T18:47:08.923 回答
0
catagory = Catagory.objects.get(get_your_catagory)
qs = Product.objects.annotate(Min('productimage__sortorder').filter(productcategory__category = catagory)

这应该只命中数据库一次,因为查询集是惰性的。

于 2012-10-04T19:22:20.070 回答