2009-06-14 12 views
3

ハローの人々、1つのスレッドが多くの記事を持つことができますジャンゴ:最後の投稿

私は2つのモデル、スレッドとポストを持っているが、作成された時点でアクティブなスレッドを取得します。私は、 'post_set.createtime'でソートすることでアクティブなスレッドを取得したいと思います。最終的には、最近の活動があったスレッドを10個正確に取得したいと思います。これは独自のSQLを使用して可能ですか?

ありがとうございます。 [質問の身体にOPの応答からモデル定義をコピーする。]

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

ただ、スレッド内のフィールド「last_post_datetime」を追加し、Post.saveでこのフィールドを更新します。

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」フィールドまたはそのような何かを持つPostオブジェクトにDateTimeField型を追加もっと簡単な方法は、おそらくあります。

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

これは、基本的にGladerの答えの変種ですが、DateTimeField型にTrueにauto_now_addを設定した場合、それはカスタムsave()方法を必要としないので、私はこれが好き:次に、これを行います。私はモデル自体のロジックを可能な限り多く保つことを好みます。

関連する問題