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)
    # ...

特定のカテゴリに関連付けられているすべての商品を取得するクエリを作成したいと思います。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.imageHAVING

4

2 に答える 2

0
catagory = Catagory.objects.get(get_your_catagory)
qs = Product.objects.annotate(Min('productimage__sortorder').filter(productcategory__category = catagory)

クエリセットは遅延しているため、これはDBに1回だけヒットするはずです。

于 2012-10-04T19:22:20.070 に答える
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 に答える