2016-08-12 78 views
1

下面是相關機型:Django的有關係伯爵跨越

class WhatToWearCandidates(models.Model): 
    profile = models.ForeignKey(Profile, null=False, blank=False, related_name="outfit_candidates") 
    look = models.ForeignKey(StyleLook, null=False, blank=False, related_name="outfit_candidates") 

class StyleLook(models.Model): 
    # Non important attributes 

class LookItem(models.Model): 
    look = models.ForeignKey(StyleLook, null=False, blank=False, related_name="lookitems") 
    item = models.ForeignKey(Product, null=False, blank=False, related_name="looks") 

我會解釋這一點,每個WhatToWearCandidates有StyleLook和配置文件,每個配置文件,我們顯示正確的外觀給他們。 StyleLook只包含關於它自己的細節。

每個StyleLook都由產品組成,我們在LookItem表中連接哪些StyleLooks包含哪些產品。

問題:我試圖收集包含4個或更少產品的WhatToWearCandidates。

我試圖使用Django的annotate()

all_candidates = WhatToWearCandidates.objects.filter(
     look__lookitems__item__assignment=assignment.id, # This is to filter based on Products that belong in the current Assignment 
     profile_id=1, # Example profile 
     look_id=15 # Testing with 1 single look for the proper profile 
    ).values('look_id').annotate(lcount=Count('look__lookitems')) 

從調試all_candidates版畫[{'look__id': 15L, 'lcount': 1}]。我知道這個外觀包含6個產品,所以我期望lcount等於6.

要仔細檢查,我試着從StyleLook代替了類似的查詢。

StyleLook.objects.filter(id__in=[15]).values('id').annotate(lcount=Count('lookitems')) 

這將返回[{'id': 15L, 'lcount': 6}]

我在做什麼錯?如何在WhatToWearCandidates查詢中將lcount等於6?

+0

我最終重新設計瞭如何訪問我想要的數據。 –

回答

0

我想你可能會遇到default ordering在你的模型之一的問題。嘗試將.order_by()添加到查詢的末尾:

all_candidates = WhatToWearCandidates.objects.filter(
    look__lookitems__item__assignment=assignment.id, 
    profile_id=1, 
).values('look_id').annotate(lcount=Count('look__lookitems')).order_by()