2012-10-04 66 views
1

我有以下型號(簡體)加入一個單行:查詢,從一個ForeignKey關係

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,我沒有看到任何方式(一)得到正確的ProductImage.image成QuerySet例如。 HAVING條款。我正在有效地嘗試從特定的ProductImage實例動態添加一個字段到Product實例(或QuerySet)。這可能不是用Django來完成的。

回答

0

這不是一個原始的查詢,但它也不是很公開的api。

您可以通過子句的查詢集添加一組其被評估之前:謹慎

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

字,雖然:此行爲不同取決於DB後端。

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

這應該只打一次數據庫,因爲查詢集是懶惰的。

+0

謝謝,我應該指定我曾試過的。我有一個類似這樣的查詢,雖然它放在GROUP BY中,因此得到正確的sort_order值,但它沒有得到我正在嘗試做的圖像。因此,當我需要爲產品顯示圖像時,數據庫仍會受到打擊。我希望有一些方法可以有效地將ProductImage.image feild添加到Product實例。我可能會做一些數據庫重新設計。 –

+0

@MicahCarrick:我認爲如果你只是添加一個'.select_related('productimage__image')',就可以工作。 – dokkaebi

+0

我也試過。沒有運氣。 –