2009-06-14 9 views
3

안녕 사람, 하나 개의 스레드가 많은 게시물을 가질 수장고 : 마지막 포스트

나는 두 가지 모델, 스레드 및 포스트가를, 생성 된 시간에 의해 활성 스레드를 검색합니다. 'post_set.createtime'을 기준으로 정렬하여 활성 스레드를 검색하려고합니다. 마지막으로 나는 가장 최근의 활동을 가진 정확히 10 개의 Thread를 얻고 싶습니다. 자신의 SQL을 사용하여이 작업을 수행 할 수 있습니까?

미리 감사드립니다.

[질문의 본체에 영업 이익의 답변에서 모델 정의를 복사.]

class Topic(models.Model): 
    title = models.CharField(max_length=50) 
    order = models.SmallIntegerField() #used for visual stuff 

class Thread(models.Model): 
    topic = models.ForeignKey(Topic) 
    name = models.CharField(max_length=50) 

class Post(Meta): 
    thread = models.ForeignKey(Thread) 
    text = models.TextField() 

class Meta(models.Model): 
    createuser = models.ForeignKey(User,default=None,blank=True,null=True,related_name="createuser") 
    createtime = models.DateTimeField(default=datetime.datetime.now,blank=True,null=True) 
    edituser = models.ForeignKey(User,default=None,null=True,related_name="edituser",blank=True) 
    edittime = models.DateTimeField(default=None,null=True,blank=True) 
+0

관련 모델의 관련 스 니펫을 게시 할 수 있다면 도움이됩니다. – ayaz

답변

2

그냥 Post.save이 필드를 스레드에 필드 'last_post_datetime'를 추가하고 업데이트 :

class Thread(models.Model) 
    ... 
    last_post_datetime = models.DateTimeField(blank=True,null=True) 

class Post(Meta): 
    ... 
    def save(self): 
     super(Post, self).save() 
     self.thread.last_post_datetime = max(self.thread.last_post_datetime, self.createtime) 
     self.thread.save() 

및 간단한 쿼리를 사용

Thread.objects.order_by('-createtime')[:10] 

물론 나는 당신이 인덱스에 추가하는 것이 좋습니다 이 필드 : 아마 쉬운 방법이있다

ALTER TABLE <post> ADD INDEX createtime (createtime); 
0

: 그런 "date_posted"필드 또는 뭔가 포스트 객체에 DateTimeField를 추가합니다.

Thread.objects.order_by('-post_set__date_posted')[:10]

이 기본적으로 Glader의 대답에 변종이다,하지만 당신은 DateTimeField에 True로 auto_now_add를 설정 한 경우 사용자 정의 save() 방법을 필요로하지 않기 때문에 나는이 더 좋아 : 그럼 이렇게. 나는 가능한 한 모델 자체의 논리를 모델 내부에 유지하는 것을 선호한다.