考虑以下两个模型:
class Post(models.Model):
created_at = models.DateTimeField(default=timezone.now)
class Reply(models.Model):
a = models.ForeignKey(Post, related_name='replies')
created_at = models.DateTimeField(default=timezone.now)
现在,我想按模型created_at
的{{1}}和模型Post
的{{1}}订购(它具有最高优先级)。
假设我有两个帖子p1,其创建时间大于p2,但p2的答案创建日期大于p1。所以p2应该先来,然后是p1。
我曾尝试在经理中这样做,但它并没有给我我想要的顺序:
created_at
原来问题是:
有一种情况是较新的帖子还没有任何回复,所以Max('replies__created_at')是无
这样可以在所有回帖后列出所有没有回复的帖子。
任何帮助??
答案 0 :(得分:0)
好的,我这样做了:
class PostManager(models.Manager):
def posts_for_user(self, user):
qs = super(PostManager, self).get_query_set().filter(user__id=user.id)
qs_a = qs.filter(replies__isnull=False).annotate(
latest_date=Max('replies__created_at')
)
qs_b = qs.filter(replies__isnull=True).extra(
select={'latest_date': 'walls_post.created_at'}
)
return sorted(chain(qs_a, qs_b),
key=attrgetter('latest_date'), reverse=True)
class Post(models.Model):
created_at = models.DateTimeField(default=timezone.now)
sorted = PostManager()
现在我能做到:
posts = Post.sorted.posts_for_user(user)
如果任何人有更好的方法,请分享。