2012-12-28 1 views
2

저는 PostgreSQL 데이터베이스 (9.2.2)를 사용하여 장고 1.4.3 및 파이썬 2.7을 실행하고 있습니다. 레코드가 마지막으로 사용자가 볼 때의 타임 스탬프 인 "last_view"필드가있는 모델이 있습니다. 내 첫 페이지에 나는 지난 주 내에서 열 개 가장 많이 본 항목을 표시하려면, 그래서 내 ListView에 내가 내 검색어 세트에 대해이 작업을 사용하여 시도 : 처음 페이지를로드 할 때Django가 timezone.now 및 __range를 사용하여 일간 범위를 쿼리하고 있습니까?

startdate = timezone.now() - datetime.timedelta(days=7) 
enddate = timezone.now() 
urlpatterns = patterns('', 
    url(r'^$', 
     ListView.as_view(
      queryset=Tag.objects.filter(last_view__range=([startdate, enddate])).order_by('-views')[:10], 
      context_object_name='most_viewed_list', 
      template_name='tags/index.html'), 
     name='index'), 

이 작동합니다. 레코드 중 하나를 클릭하고 "보기"하면 last_view 속성이 데이터베이스에서 업데이트됩니다. 그러나 페이지를 다시로드하면이 항목은 "최근에 본"목록 (위에서 설명한 쿼리 세트에 의해 형성됨)에서 사라집니다.

나는이 문제가이 post과 관련이 있다고 생각하여 timezone.now()의 "enddate"가 서버 프로세스를 시작할 때 제한적으로 보입니다. 따라서 서버가 실행 된 후 링크를 ​​클릭하면 "현재 시간"이 "now()"와 범위 밖에서 비교됩니다 (즉, 페이지를 다시로드하면 클릭 한 레코드가 사라집니다). 제가 위에서 언급 한 게시물로 바로 지금에 상황을 타개 경우, 나는 페이지로드 오류가 발생 :

startdate = timezone.now - datetime.timedelta(days=7) 
enddate = timezone.now 

지원되지 않는 피연산자 유형 (들) - '기능'과 'datetime.timedelta을 '

그래서 startdate 변수를 만들 수 없습니다. 이 쿼리 세트를 _range에서 _gte로 변경하면 작동하지만이 경우 now()이 "현재 시간"대신 서버 프로세스가 시작될 때 실제로 시간이 표시되면 시간이 지날 것입니다.

queryset=Tag.objects.filter(last_view__gte=(timezone.now() - datetime.timedelta(days=7)).order_by('-views')[:10] 

Django Tutorial on testing 그러나 그들이 ... 지금 에서을 일을 빼거나 timedelta 또는 기간과 사용 방법을 표시하지 않습니다, 날짜를 통해 쿼리를 만드는 지금 을 사용하는 방법을 보여줍니다 않습니다

now() 대신 (지금)을 사용하여 실제 시간과의 시간차를 얻는 방법을 설명해 주실 수 있습니까? now()의 제한 사항을 더 잘 이해하고 싶습니다. 나는 timedelta()로 찾을 수있는 모든 예제가 timezone.now() 또는 datetime.now()를 참조하기 때문에 훌륭한 문서를 찾을 수 없다.

감사합니다.

답변

5

서브 클래스 ListViewget_queryset 메서드를 재정의하십시오. get_queryset 메서드 내에서 startdateenddate을 계산하면 timezone.now()은 요청이 만들어진 시간이되며 urls.py이 처음로드 된 시간이 아닙니다.

class TagListView(ListView): 
    def get_queryset(self): 
     startdate = timezone.now() - datetime.timedelta(days=7) 
     enddate = timezone.now() 
     return Tag.objects.filter(last_view__range=[startdate, enddate]).order_by('-views')[:10] 
    context_object_name='most_viewed_list' 
    template_name='tags/index.html' 

urlpatterns = patterns('', 
    url(r'^$', TagListView.as_view(), name='index'), 
) 
+0

명확하고 간결한 응답을 보내 주셔서 감사합니다. 그게 해결 됐어. 나는 urls.py가 한 번만로드되었다는 것을 몰랐다. – user

관련 문제