3

皆さん、こんにちは。

スレッドとポストの 2 つのモデルがあり、1 つのスレッドが多くのポストを持つことができます。「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)
4

2 に答える 2

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);
于 2009-06-14T16:01:35.757 に答える
1

おそらくもっと簡単な方法があります:) 「date_posted」フィールドなどで DateTimeField を Post オブジェクトに追加します。次に、これを行います:

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

これは基本的にGladerの回答の変形ですが、DateTimeFieldでTrueにsave()設定するとカスタムメソッドが必要ないため、私はこれが好きです. auto_now_add私は、モデルのロジックをできるだけモデル自体の内部に保持することを好みます。

于 2013-10-08T07:13:14.847 に答える