2012-07-28 31 views
1

我有這樣一個表:Django:如何做聚合(GroupBy ID)和最新的時間戳?

ID | Time Stamp 
1  | 2012-07-28 18:57:48.160912+01 
1  | 2012-07-28 20:57:43.063327+01 
2  | 2012-07-28 21:17:16.016665+01 

我希望看到每個ID的最新條目。

如果我這樣做,我只能得到一個對象與最新的條目:

open_deals = all_deals.latest('time_stamp')) 

-->  2 | 2012-07-28 21:17:16.016665+01 

但我想獲得

--> 1  | 2012-07-28 20:57:43.063327+01 
     2  | 2012-07-28 21:17:16.016665+01 

我需要以某種方式聚合或GROUPBY的ID 。但是在文檔中沒有這個功能。

任何提示?謝謝

更新:

我曾嘗試以下解決方案:

result_list = [deal.dealchangelog_set.latest('time_stamp') for deal in open_deals] 
     result_set = set() 
     for item in result_list: 
      result_set.add(item.pk) 
     return open_deals.filter(pk__in = result_set) 

enter image description here

可惜的是,你可以看到列表中仍然包含三個對象,而不是兩個。 :-(

這裏是我的模型(注意我沒有使用deal_id作爲pk)pk仍然是整數 在我的情況下,我需要得到最新的deal_id,這不是唯一的。 (爲簡單起見,我已經表明以前的UUID在這裏爲整數)

class Deal(models.Model): 
    deal_id    = UUIDField() 
    status    = models.ForeignKey(DealStatus, verbose_name=_(u"Deal Status"), null=True, blank=True)  
    contact    = models.ForeignKey(Contact) 
    deal_type   = models.ForeignKey(DealType)  

class DealChangeLog(models.Model): 
    deal    = models.ForeignKey(Deal) 
    time_stamp   = CreationDateTimeField() 

更新2:

def get_open_deals(call): 
     all_deals = Deal.objects.filter(contact=call.contact)    
     closed_deals = all_deals.filter(status__in=[5, 6]) 
     closed_deal_list = [] 
     if closed_deals: 
      for item in closed_deals: 
       closed_deal_list.append(item.deal_id) 
     open_deals = all_deals.exclude(deal_id__in=closed_deal_list)   
     result_list = [deal.dealchangelog_set.latest('time_stamp') for deal in open_deals] 
     result_set = set() 
     for item in result_list: 
      result_set.add(item.pk) 
     return open_deals.filter(pk__in = result_set) 

回答

0

我不情境感知,但我可能會分手,如型號這個:

class Deal(models.Model): 
    title = models.CharField() 
    # maybe signal changes etcetera... 

class DealChangeLog(models.Model): 
    deal = models.ForeignKey(Deal) 
    date = models.DateTimeField(auto_now=True, auto_now_add=True) 

然後,你可以通過列表理解實現你的結果:

results = [deal.dealchangelog_set.latest('date') for deal in Deal.objects.all()] 

要得到的結果作爲查詢集,你可以這樣做:

Deal.objects.filter(id__in=[result.deal.id for result in results]) 

但是如果你可以用結果作爲工作一個列表我沒有看到太多額外的查詢點

+0

,感謝您的解決方案。我試過了。但我需要結果作爲QuerySet而不是列表。那可能嗎? 'formset = deal_formset(queryset = get_latest_deals())' – Houman 2012-07-29 09:18:52

+0

啊不用擔心,我已經想出瞭如何製作一個查詢集,但解決方案仍然無法正常工作。我發佈了更多信息。非常感謝 – Houman 2012-07-29 10:05:17

+0

我已經將查詢結果添加爲查詢集,但是有沒有理由不能使用列表? – 2012-07-29 17:26:47