2012-03-01 3 views
0

나는 장고 모델장고 order_by의 외래 키 세트 모델

class Post(models.Model): 
    title = models.CharField(max_length=240) 

class Comment(models.Model): 
    post = models.ForeignKey(Post) 
    date = models.DateTimeField(auto_now_add=True) 

내가 코멘트 검색어 세트를 필요로 후 날짜, 우편으로 첫번째 순서를 다음했다. 게시물은 최신 코멘트로 주문해야합니다. 내가 검색어 세트의 order_by에서 모델 방법을 사용할 수 있다면

,이 같은 것 :

class Post(models.Model): 
    title = models.CharField(max_length=240) 

    def get_last_comment_date(self): 
     return self.comment_set.order_by('-date')[0].date 

그리고 순서를, 내가 필요하다고, 수 :

Comment.objects.all().order_by('post__get_last_comment_date', '-date') 

그러나 불행하게도, 메소드 order_by는 허용되지 않습니다.

도와주세요. 주문할 수 있습니까?

답변

4

으로 변환되었으므로 order_by lookups에서 메서드를 사용할 수 없습니다.

따라서 은 get_last_comment_date를 필드로 변환하지 않으시겠습니까? 예 : signal receiver 사용 :

from django.db.models import signals 

class Post(models.Model): 
    title = models.CharField(max_length=240) 
    last_comment_date = models.DateField(null=True, blank=True) 

def post_last_comment_date(sender, instance=None, **kwargs): 
    try: 
     last_comment_date = self.comment_set.order_by('-date')[0].date 
    except Comment.DoesNotExist: 
     return 

    if last_comment_date != comment.post.last_comment_date: 
     comment.post.last_comment_date = last_comment_date 
     comment.post.save() 

signals.post_save.connect(post_last_comment_date, sender=Comment) 

을 지금, 당신은 할 수 있습니다 Comment.objects.order_by('post__last_comment_date', '-date')

+0

감사합니다! Post 모델에 'last_comment_date'필드를 추가하고 매번 특정 게시물에 대한 새 코멘트가 발생할 때마다 업데이트해야합니다. 그러나 당신의 해결책은 훨씬 낫습니다! – stalk

+0

이전 댓글에 너무 빠르다. 이 솔루션은 모든 새로운 주석에 필드를 업데이트합니다. 그것은 작동합니다 (코드의 일부 수정, 즉 '자체'에서 '인스턴스'로 이름 바꾸기).하지만 새로운 코멘트가있을 때마다 데이터베이스에 대한 추가로드가 발생합니까? – stalk

+0

예, 댓글 게시시 발생하는 2 건의 질문 (예 : 3 건의 경우)을 처리하고 있습니다. 나에게 공평한 것처럼 들린다. – jpic