어떤 글이 작성된 순간으로부터 지금까지 경과한 시간을 도출해내는 함수를 쓰고 싶은데 도와주세요

class Post(models.Model):

    created_date = models.DateTimeField(
        default=timezone.now
        )


    def elasped_time(self):
        now = datetime.now()
        then = self.created_date
        timedelta = now - then
        minutes = timedelta.seconds/60
        return minutes


그냥 프로그래밍 초보인데, stackoverflow를 참고해서 모델을 이렇게 만들었습니다.

models.py 에 있는 내용입니다.

그런데 views.py에

def post_list(request):
        post_list = Post.objects.all().order_by(elasped_time)
        template = loader.get_template('blog/index.html')
        context = {
            'post_list': post_list,
        }
        return HttpResponse(template.render(context, request))

이렇게 해서 실행하려고 하니

TypeError at / expected string or bytes-like object

이렇게 뜨면서

post_list = Post.objects.all().order_by(elasped_time) 

여기가 문제라고 합니다.

제가 초보라 그런데 어떻게 해야하나요?

알려주시면 감사하겠습니다.

그리고 추가로 혹시 위에 제가 만든 elasped_time 을 단순한 float 나 integer 값으로 얻을 수 있을까요?

그 값을 통해 연산을 하고 싶습니다.

2답변

  • 좋아요

    3

    싫어요
    채택취소하기

    시간순 정렬을 하고 싶으신것 같은데요. 정렬의 기준이 되는 필드명을 적어주셔야 하는데 메소드명을 적어 주셔서 그렇습니다.

    Post.objects.all().order_by('created_date') 라고 적어서 사용해 보세요. 작성된 순서로 정렬이 되어 있을겁니다.

    최근것 부터 보고 싶으면 Post.objects.all().order_by('-created_date')라고 적어서 사용하시면 됩니다.


    추가 답변

    최근 5분간의 Post를 보시려면 아래와 같이 하시면 됩니다.

    from datetime import datetime, timedelta
    
    five_minute = datetime.now() - timedelta(minutes=5)
    Post.objects.filter(created_date__gt=five_minute)
    

    created_date__gt의 사용법과 관련한 자세한 내용은 여기를 참고하세요.

    • 좋은 답변 감사합니다 그러면 혹시 단순히 필드를 넘어서는 조건인 듯 한데, 최근 5분이내의 글만 보기 같은 것은 어떻게 손봐야 구현가능할지 여쭤봐도 될까요? 홍민구 2016.7.15 11:14
    • 답변을 추가했습니다. 정두식_ 2016.7.15 14:10
    • 정말 감사합니다. 큰 도움이 되었습니다. 홍민구 2016.7.15 18:52
  • 장고에서 현재 시간을 얻고자 하실 때에는 datetime.datetime.now() 보다는 django.utils.timezone.now() 를 쓰시는 것이 좋습니다.

    왜냐하면, 장고의 기본 DateField/DateTimeField에는 timezone 정보가 있는데, datetime.now() 에는 timezone 정보가 빠져있기 때문입니다.

    from django.utils import timezone
    from datetime import timedelta
    
    five_minute = timezone.now() - timedelta(minutes=5)
    Post.objects.filter(created_date__gt=five_minute)
    

    AskDjango

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.