2

저는 Order 모델과 order_event 모델이 있습니다. 각 order_event에는 주문할 외래 키가 있습니다. 주문 인스턴스에서 얻을 수 있습니다 : myorder.order_event_set. 모든 주문 목록을 가져오고 싶지만 마지막 주문 날짜별로 정렬되기를 원합니다. 이 같은 문은 최신 이벤트 날짜별로 정렬 작동합니다django queryset을 관련 모델 하위 집합의 최신 인스턴스로 정렬합니다.

queryset = Order.objects.all().annotate(
    latest_event_date=Max('order_event__event_datetime') 
    ).order_by('latest_event_date') 

그러나, 내가 정말 필요로하는 이벤트의 부분 집합의 최신 날짜별로 정렬 모든 주문의 목록입니다. 예를 들어 내 이벤트는 "일정", "처리"등으로 분류됩니다. 따라서 모든 일정을 최신 일정 이벤트별로 정렬 할 수 있어야합니다. 이 django 문서 (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#filter-and-exclude)는 필터를 사용하여 최신 일정 이벤트를 얻는 방법을 보여 주지만 일정이없는 주문은 제외합니다 행사.

나는 필터링 된 queryset을 스케줄링 이벤트가없는 순서를 포함하는 queryset과 결합 할 수 있다고 생각했지만이 작업을 수행하는 방법을 잘 모르겠습니다. 나는 파이썬 목록을 사용하여 관련 답변을 보았다하지만

편집 재 (즉 매김과 함께보기 등) 적절한 장고의 검색어가 훨씬 더 유용 할 것이다 : 의견/제안 또한

class Order(models.Model): 
    desc = models.CharField(max_length=30) 

class Order_event(models.Model): 
    order = models.ForeignKey(Order) 
    event_datetime = models.DateTimeField(auto_now_add = True) 

, 나는 하나 이상의 성명서에서 그렇게하지 않아도된다. 또한 orm 대신 python을 통한 정렬 등은 거대한 데이터 세트로 작업하지 않기 때문에 ok입니다. 가능하다면 언급 한 이유로 SQL에서 멀리 떨어져있는 것을 선호합니다. 별개의 정렬 된 쿼리 세트를 결합하는 것이 유망한 것으로 보이지만, 나는 막혀있다.

+1

관련 모델을 제공하면 이해하기가 더 쉬울 것입니다. – acjay

+0

모델이 필요하지 않습니다. 정확히 무엇을 묻고 있는지 이해합니다. 불행히도 가능할지 모르겠지만 적어도 순수 ORM 코드는 아닙니다. – Greg

답변

1

좋아, 나는 당신이 extra 방법으로 이것을 달성 할 수 있다고 생각하지만, 내가 알 수있는 한, 순수한 데이터베이스에 무관 한 orm은 없다. 즉, 사용중인 db 백엔드에 대해 SQL이 작동하는지 확인하고 테이블 이름을 장고 별칭에주의해야하지만 모든 쿼리를 한 번만 수행하면됩니다. 이 라인을 따라

뭔가 일을해야 의미가

latest_event_subquery = 'select max(event_datetime) ' \ 
         'from appname_order_event ' \ 
         'where appname_order_event.category="scheduling" and ' \ 
           'appname_order_event.event_id=appname_order.id' 
queryset = Order.objects.extra(select={'latest_event_date': latest_event_subquery}).order_by('latest_event_date') 

합니까를?

+0

이것이 작동해야하는 이유를 알 수 있습니다. 올바른 쿼리 세트를 선택하는 것처럼 보입니다 (즉, 모든 주문은 필터링되지 않습니다). 그러나 latest_event_date는 "일정"이벤트가있는 일부 주문에 대해서는 none을 반환합니다. 왜 그랬는지 정확히 모르겠습니다.나는 이것이 왜이 문제를 해결할 수있는 유일한 방법 인 것 같으므로 왜 계속 보려고 노력할 것입니다. – rsp

+0

어떤 백엔드를 사용하고 있습니까? – Greg

+0

또한'str (queryset.query)'의 출력을 붙여 넣을 수 있습니까? – Greg

0

그레그의 대답은 훌륭하고 잠시 사용했습니다. 그러나 latest_event의 다른 필드에 액세스하려고했습니다. 그래서, 주문의 필드로 latest_event를 저장 결국 :

# The latest event 
latest_event = db.ForeignKey('whateverapp.Event', editable=False, null=True) 

가 그럼 난시 최신 이벤트를 다시 계산하는 신호를 설정 저장 :

@receiver(post_save, sender=Event) 
def visit_calculate_latest(sender, instance, **kwargs): 
    """Recalculate latest event""" 
    instance.parent.latest_event = instance.parent.get_latest_event() 
get_latest_event()는 쿼리를했다

:

def get_latest_event(self): 
    """Return most recent event or None.""" 
    try: 
     return Event.objects.filter(
      parent=self.id).order_by('-event_date', '-id')[0] 
    except IndexError: 
     return None 

지금은 latest_event__whatever으로 필터링 할 수 있습니다

return qs.filter(qobjs).order_by('-latest_event__event_date', 
     '-latest_event__pk') 
,
관련 문제