我有以下模型(简化):
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 的方法。