你好,
我有两个模型,Thread和Post,其中一个Thread可以有很多帖子。我想通过'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)
答案 0 :(得分:2)
只需在Thread中添加字段'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);
答案 1 :(得分:0)
可能有一种更简单的方法:)使用“date_posted”字段或类似内容将DateTimeField添加到Post对象。然后这样做:
Thread.objects.order_by('-post_set__date_posted')[:10]
这基本上是Glader答案的变体,但我更喜欢这个,因为如果在DateTimeField上将save()
设置为True,则不需要自定义auto_now_add
方法。我更喜欢尽可能地将模型的逻辑保留在模型内部。