0

考虑以下两个模型:

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模型Postcreated_at模型排序Reply(它具有最高优先级)。

假设,我有两个帖子 p1 的创建时间大于 p2,但 p2 的回复的创建日期大于 p1。所以p2应该先出现,然后p1。

我试图在经理中做到这一点,但它并没有给我我想要的顺序:

class PostManager(models.Manager):
    def get_query_set(self):
        return super(PostManager, self).get_query_set().annotate(
            reply_date=Max('replies__created_at')
        ).order_by('-reply_date', '-created_at')

原来问题是这样的:

  • 有一种情况是较新的帖子还没有任何回复,因此 Max('replies__created_at') 为 None

  • 这将使所有没有任何回复的帖子都列在所有有回复的帖子之后。

有什么帮助吗??

4

1 回答 1

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)

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

于 2013-10-10T21:20:41.827 回答