私は次のモデルを持っています(簡略化):
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)
# ...
特定のカテゴリに関連付けられているすべての商品を取得するクエリを作成したいと思います。1つのクエリでカテゴリ内のすべての商品を表示するために必要なすべてのデータを取得できるように、関連する多くの画像の1つ(最も低い画像)をクエリセットに含めたいと思います。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'))
このクエリは実行しますが、(a) QuerySetGROUP BY
に権利を取得する方法がわかりません。句。特定のProductImageインスタンスからProductインスタンス(またはQuerySet)にフィールドを動的に追加しようとしています。これはDjangoでそれを行う方法ではないかもしれません。ProductImage.image
HAVING