2014-05-12 6 views
2

장고에서 주문 방법을 사용할 수 있습니까? 나는 질문이 'date_of_receive'에 의해 주문하려는 장고에서 주문 방법을 사용할 수 있습니까?

class Question(models.Model): 
    writer = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, 
           related_name='questions', 
           on_delete=models.SET_NULL) 
    contents = models.TextField() 

    def date_of_receive(self): 
     try: 
      return self.answers.first().creation.date() 
     except AttributeError: 
      return None 
     except: 
      assert False, 'error' 

class Answer(models.Model): 
    writer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='answers') 
    contents = models.TextField() 
    question = models.ForeignKey(Question, related_name='answers', null=True, 
           on_delete=models.SET_NULL) 

...

어떻게해야합니까?

+4

처럼 베어 뭔가를 수행하여 순서를 달성 할 수 있지만. 나는 그것을 떨어 뜨리는 것이 좋습니다. 본질적으로 특별한 예외의 이름을 지정하지 않고'except' 절을 사용하는 이유는 없습니다.이 경우 AttributeError 예외는 원하는 것을 수행하고 AttributeError가 아닌 예외는 catch되지 않도록합니다. –

답변

0

결과를 파이썬으로 정렬해야합니다. date_of_receive이 방법이므로 데이터베이스 수준에서 정렬 할 수 없습니다.

4

order_by을 사용하여 데이터베이스를 정렬하거나 모든 결과를 응용 프로그램 프로세스의 메모리로 가져 와서 정렬하여 두 가지 방법으로 주문할 수 있습니다. 데이터베이스는 파이썬이나 메소드에 대해 아무것도 모르기 때문에 메모리에서 정렬하면 메소드의 결과로만 정렬 할 수 있습니다.

그러나이 경우 사용자의 방법을 데이터베이스 호출로 줄일 수 있습니다. .order_by('answers__creation')은 원하는 것을 제공하지만, 그렇지 않으면 집계 및 주석을 사용하여 FIRST 생성 날짜 시간 만 가져올 수 있습니다. 나는 다음과 같이 보일 것입니다 :

from django.db.models import Min 

Question.objects.annotate(date_of_receive=Min('answers__creation')).order_by('date_of_receive') 

매우 큰 데이터 세트에서 이것을 효율적으로 수행 할 방법이 없다는 것에 유의하십시오. 수십만 개의 행이있는 경우 응용 프로그램 메모리를 전혀 정렬하지 않아야하며 데이터베이스 메모리를 정렬하는 데 시간이 오래 걸립니다. 이 시점에서 데이터를 비정규 화해야합니다. 그러나 데이터를 비정규 화하는 것이 미묘한 버그를 도입하는 좋은 방법이기 때문에 데이터 세트가 그만큼 커질 것이라고 생각한다면 그렇게하십시오.

1

수 없습니다. Django의 order_by()은 데이터베이스 수준에서 작동합니다.

당신이 엉망 당신의 역 추적을 제외하고 아무것도하지 않는 (제외/제외/당신의 시도의 마지막 절) "를 제외하고"그냥 참고로

sorted(Question.objects.all(), key=lambda k: k.date_of_receive()) 
관련 문제