2011-10-10 4 views
1

받은 편지함보기를 쓰고 있는데 본 메시지에서 보이지 않는 메시지를 제외하고 싶습니다. 내 코드는 다음과 같습니다쿼리 집합에서 쿼리 집합을 제외하는 가장 좋은 방법은 무엇입니까

데프 render_notifications (요청) : 당신은 내가 편리하지 않는 것 루프를 사용하여 모든 보이지 않는 메시지를 제외하고 아니에요 볼 수 있듯이

unseen_notices = notification.Notice.objects.filter(recipient=request.user,unseen=True).order_by("-added") 
notices = notification.Notice.objects.filter(recipient=request.user).exclude(id__in = [i.id for i in unseen_notices]).order_by("-added") 

for msg in unseen_notices: 
    msg.unseen = False 
    msg.save() 

context = RequestContext(request,{'notices':notices, 
       'unseen_notices':unseen_notices}) 
return render_to_response('my_notifications.html',context_instance=context) 

물론이 라인은 성능 문제를 일으키는가?

사항 = notification.Notice.objects.filter (받는 사람 = request.user) .exclude (id__in = unseen_messages)

: 그리고 마지막으로 내가 비슷한이 라인을 대체 할 수있는 방법이

편집 : 페이지를 방문 할 때와 같이 나는 모든 보이지 않는 메시지를 표시하기 때문에

나는 제대로 보이지 않는 = 거짓을 사용하여 볼 메시지를 얻을 수 없습니다. 이상한 이유로 알림 쿼리에서 unseen = False를 사용하면 표시되지 않은 모든 메시지가 notices 쿼리에서 검색됩니다.

+1

궁금한 점이 있다면, '눈에 보이지 않는 = 거짓'으로 필터링 할 수 없습니까? 즉, 'notices = notification.Notice.objects.filter (receipient = request.user, unseen = False) ...' –

+0

내가 그렇게하면 보이지 않는 메시지가 표시된 것으로 표시되고 이유는 알 수 없지만 보이지 않게됩니다. 고지 쿼리 집합. – iva123

답변

1

Django querysets are lazy. 위의 설명에 따라 Derek의 제안을 따랐을 때 '보이지 않는'고지가 표시된 고지 목록에 나타나는 이유가 여기에 설명되어 있습니다. 주의 사항 조회는 render_to_response을 호출 할 때 템플리트가 렌더링 될 때까지 실행되지 않습니다. 이 시간대별로 이미 표시된대로 msg를 저장했습니다.

질문 모음에 list() (으)로 전화하면 즉시 평가되며 '눈에 보이지 않는'알림은 더 이상 표시되지 않습니다.

def render_notifications(request): 
    user_notices = notification.Notice.objects.filter(recipient=request.user).order_by(-'added') 
    unseen_notices = list(user_notices.filter(unseen=True)) 
    notices = list(user_notices.filter(unseen=False)) 
    <snip> 

대안은 다음 다음 마지막으로 응답을 반환, 알림에 unseen 플래그를 업데이트 응답을 렌더링하는 것입니다. 내가 대신 각 통지를 통해 반복의 검색어 세트의 update 방법을 사용했습니다

def render_notifications(request): 
    user_notices = notification.Notice.objects.filter(recipient=request.user).order_by(-'added') 
    unseen_notices = user_notices.filter(unseen=True) 
    notices = user_notices.filter(unseen=False) 

    context = RequestContext(request,{'notices':notices, 
      'unseen_notices':unseen_notices}) 
    response = render_to_response('my_notifications.html',context_instance=context) 

    # update the seen flag 
    unseen_notices.update(unseen=False) 

    return response 

참고. 모델에 사용자 정의 저장 메소드가 있거나 작성된 사전/사후 저장 후크를 사용하는 경우에는이 작업을 수행 할 수 없습니다.

1

당신이 여기처럼 뭔가를 할 수 것처럼 보일 :

user_notices = notification.Notice.objects.filter(recipient=request.user) 
unseen_notices = user_notices.filter(unseen=True).order_by("-added") 
notices = user_notices.exclude(unseen=True).order_by("-added") 
+0

+1'user_notices'를 설정하면받는 사람 필터를 반복하지 않습니다. 'order_by' 호출을'user_notices' queryset에 두어 DRYer가되도록 할 수 있습니다. – Alasdair

관련 문제