Sql Django:在创建最后一篇文章时检索活动线程

Sql Django:在创建最后一篇文章时检索活动线程,sql,django,model,relation,Sql,Django,Model,Relation,大家好 我有两个模型,线程和帖子,其中一个线程可以有许多帖子。我想通过“post_set.createtime”排序来检索活动线程。最后,我想得到最近活动的10个线程。这是否可以不使用自己的SQL 先谢谢你 [复制OP对问题主体的答复中的模型定义。] class Topic(models.Model): title = models.CharField(max_length=50) order = models.SmallIntegerField() #used for visu

大家好

我有两个模型,线程和帖子,其中一个线程可以有许多帖子。我想通过“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)

只需在线程中添加字段“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);
altertable添加索引createtime(createtime);

可能有一种更简单的方法:)在Post对象中添加一个带有“date\u posted”字段或类似字段的DateTimeField。然后这样做:

Thread.objects.order\u by('-post\u set\u date\u posted')[:10]


这基本上是Glader答案的一个变体,但我更喜欢它,因为如果您在DateTimeField上将
auto\u now\u add
设置为True,则它不需要自定义
save()
方法。我更喜欢将模型的逻辑尽可能多地保存在模型本身中。

如果您可以发布两个相关模型的相关片段,这会有所帮助。