按对象的日期和相关对象的最新日期排序

时间:2013-10-10 19:18:02

标签: python django django-models django-1.4

考虑以下两个模型:

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')是无

  • 这样可以在所有回帖后列出所有没有回复的帖子。

任何帮助??

1 个答案:

答案 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)

如果任何人有更好的方法,请分享。