Django: Извличане на активни нишки до момента на създаване на последната публикация

Здравейте хора,

Имам два модела, нишка и публикация, където една нишка може да има много публикации. Искам да извлека активните нишки чрез сортиране по 'post_set.createtime'. В крайна сметка искам да получа точно десет нишки, които са имали най-новата активност. Възможно ли е това без собствен 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)

person Community    schedule 14.06.2009    source източник
comment
Ще помогне, ако можете да публикувате подходящи фрагменти и от двата участващи модела.   -  person ayaz    schedule 14.06.2009


Отговори (2)


Просто добавете поле „last_post_datetime“ в Thread и актуализирайте това поле в 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);
person Glader    schedule 14.06.2009

Вероятно има по-лесен начин :) Добавете DateTimeField към обекта Post с поле "date_posted" или нещо подобно. След това направете това:

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

Това по същество е вариант на отговора на Glader, но това ми харесва повече, защото не изисква персонализиран save() метод, ако зададете auto_now_add на True в DateTimeField. Предпочитам да запазя логиката на модела колкото е възможно повече вътре в самия модел.

person Xudonax    schedule 08.10.2013