Django: Получить активные темы к моменту создания последнего сообщения - PullRequest
3 голосов
/ 14 июня 2009

Привет,

У меня есть две Модели, Тема и Сообщение, где одна Тема может иметь много Сообщений. Я хочу получить активные темы, отсортировав по post_set.createtime. В конце я хочу получить ровно десять потоков, которые имели самую последнюю активность. Возможно ли это без использования собственного 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)

Ответы [ 2 ]

2 голосов
/ 14 июня 2009

Просто добавьте поле '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 голосов
/ 08 октября 2013

Вероятно, есть более простой способ :) Добавьте DateTimeField к объекту Post с полем date_posted или чем-то в этом роде. Затем сделайте это:

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

Это в основном вариант ответа Глейдера, но мне это нравится больше, потому что он не требует специального метода save(), если вы установите auto_now_add в True в DateTimeField. Я предпочитаю держать логику модели как можно больше внутри самой модели.

...