2014-03-04 1 views
0

내 이미징 사이트의 다음 및 이전 레코드를 선택하는 데 문제가 있습니다. Scenrio는 매우 간단합니다. 하지만 조금 혼란 스러웠습니다.다음 및 이전 이미지를 가져 오는 가장 좋은 방법 Django

나는 그들이 추가 된 날짜순으로 정렬 된 이미지 목록을 가지고 있습니다. (가장 최근의 초기).

Picture.objects.all().order_by('-created_at') 

사용자가 이미지를 열면 다음 및 이전 그림에 대한 링크를 제공해야합니다. 두 개 이상의 사진 같은 created_at 일이있을 때

여기
image = Picture.objects.get(id=pic_id) 
next = Picture.objects.filter(created_at__lte=image.created_at) 
previous = Picture.objects.filter(created_at__gte=image.created_at) 

if next: 
    next = next.exclude(id=image.id).order_by('-created_at')[0] 
if previous: 
    previous = previous.exclude(id=image.id).order_by('created_at')[0] 

return (next, previous) 

문제는, 다음 less than or equal 검사가 실패, 문제가있는 것입니다. 그림을 less than으로 제한하면 다음 또는 이전 날짜와 시간이 같은 그림이 선택되지 않습니다. `

코드를 확인하고 내가이 향상되어야하는 부분을 참조하시기 바랍니다 (멀티 파일 업로드가 동시에 DB에 이미지를 저장).

감사합니다.

+2

Andrew의 대답에 따라 ID도 정렬해야합니다. 그냥'DateField' 대신'DateTimeField'를 사용하여 언급 할 가치가 있다고 생각했습니다. – Anentropic

답변

2

작성한 날짜를 사용하여 결정 성있는 정렬을하지 못한다는 것을 알고 있었기 때문에 그림의 ID별로 정렬해야합니다. 이전 그림은 현재 날짜보다 작거나 같은 작성 날짜 및 이전 ID로 작성된 날짜입니다.

이것은 복잡한 쿼리이므로 Q objects을 사용해야합니다.

next = Picture.objects.filter(Q(created_at__lt=image.created_at) | Q(created_at=image.created_at, id__lt=image.id)) 

if next: 
    next = next.order_by("-created_at", "id")[0] 
+1

감사합니다. Andrew, 제대로 작동하는 것 같습니다. 어떻게 Q를 사용하여 다른 필터를 추가 할 수 있습니까? 도시에서 그림 레코드를 필터링하고 싶습니다. 여기서 city = this.city. 나는 .filter()를 추가하고 잘 동작하는 것 같다. 그러나 나는 이것도 역시 물어야한다고 생각한다. – Clayton

+0

Q()가 완벽하게 작동하는 것 이외에, 혼란을 해결해 주셔서 감사합니다 ... +1 – Clayton

관련 문제