2013-03-28 144 views
2

我遇到了一個問題,在我的django視圖中,我無法完全獲取從複雜的.annotate()調用中獲取的所有信息。這裏是我的模型:django查詢集上的複雜註釋

RECORD_STATUS = (
    (0, "Hidden"), 
    (1, "Unhidden"), 
    (2, "Deleted"), 
) 
class Activity(models.Model): 
    event_date = models.DateTimeField() 
    duration = models.IntegerField(default=0) 
    username = models.CharField(max_length=200) 
    record_id = models.CharField(max_length=100) 
    record_status = models.IntegerField(choices=RECORD_STATUS) 
    record_quality = models.FloatField(default=0) 

我想根據不同RECORD_ID以下值傳遞給我的視圖模板:

  • 平均質量
  • 最新EVENT_DATE
  • 總時長

and ...

...最新狀態(以最新EVENT_DATE活動狀態特定RECORD_ID)

我已經能夠讓大多數的這些按計劃,有以下查詢集codechunk但我無法搶特定record_id的最新狀態。我傾向於認爲.extra()電話可能是要走的路,但我似乎無法正確構建。

record_id_details = Activity.objects.values(
    'record_id', 
    ).annotate(
    ave_quality=Avg('record_quality'), 
    count=Count('id'), 
    latest_event_date=Max('event_date'), 
    total_duration=Sum('duration'), 
    # Here's where I'm going wrong 
    # I need the record_statuses from the most recent Activities of each record_id 
    latest_status=,# dont know... record_status WHERE Max(event_date) ??? 
).order_by(sort) 

任何意見,作爲對註釋的說法,會給我我需要什麼,或許有些幫助構建額外的命令,將不勝感激。謝謝!

回答

0

我只是執行第二個查詢,以便我可以保持所有的分開。例如:

latest = Activity.objects.filter(record_id="whatever_the_record_id_you_want").order_by("-event_date) 
most_recent = latest[0] 
what_you_asked_for = most_recent.record_status 
+0

這是排序我結束了什麼。感謝你的回答。 –

1

有沒有內置的方式來表達此查詢與Django查詢集。在兩個查詢中執行它可能是純粹使用ORM的最簡單方法。如果你不介意一些原始的SQL,並且你使用了一個支持它的數據庫,比如PostgreSQL,那麼你需要的工具叫做窗口函數,你可以在這裏找到很好的細節:http://www.postgresguide.com/tips/window.html

+0

感謝您的幫助。決定去解決兩個問題。 –