2013-03-28 2 views
2

복잡한 장황함에서 필요한 모든 정보를 얻을 수없는 문제가 있습니다. 내 장고보기에서 .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
  • 총 지속 기간

및 0 ... 나는 다음의 검색어에 codechunk으로, 의도 한대로 이들의 대부분을 얻을 수있었습니다하지만 난 잡아 드릴 수 없습니다

최신 상태 (특정 RECORD_ID에 대한 최신 EVENT_DATE와 활동의 상태) 특정 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

장고의 검색어와이 쿼리를 표현 할 내장 방법은 없습니다. 두 개의 쿼리로 수행하는 것이 아마도 ORM으로 순전히 수행하는 가장 쉬운 방법 일 것입니다. 일부 원시 SQL에 신경 쓰지 않고 PostgreSQL과 같은 데이터베이스를 지원하는 데이터베이스를 사용하는 경우 원하는 도구를 Window Function이라고하며 여기에서 자세한 내용을 찾을 수 있습니다. http://www.postgresguide.com/tips/window.html

+0

도움을 주셔서 감사합니다. 두 가지 질문을하기로 결정했습니다. –