从按最新排序的查询集中获取不同的 Django 对象

Get distinct django objects from queryset sorted by latest

我有这个模型(隐藏了不相关的字段):

class Blog(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    is_published = models.BooleanField(default=False)
    published_date = models.DateTimeField(null=True, default=None, blank=True)

我只想获取每个作者的最新 post,按发布日期排序。

在我看来,我尝试过以下方法:

blog_list = Blog.objects.filter(is_published=True).order_by('author', '-published_date').distinct('author')

有效 除了 这会将所有博客 post 按作者顺序排序,而不是按发布日期排序。

以下内容实际上可以通过切换顺序来达到目的,但这会在 django 中引发错误:

blog_list = Blog.objects.filter(is_published=True).order_by('-published_date', 'author').distinct('author')

我已经检查了所有与此类似的问题,但没有遇到有效的解决方案。我认为这个请求应该很简单,但我没有看到任何实现它的方法。

试试这个解决方案

blog_list = Blog.objects.filter(is_published=True).distinct('author').order_by('-published_date', 'author')

您可以在官方 Djang documentation 中阅读此 post。 基于此post,当你在distinct子句中指定字段名时,你必须在QuerySet中提供一个order_by(),并且order_by()中的字段必须以相同的顺序从 distinct() 中的字段开始。 要实现您上面所说的目标,请遵循以下步骤:

from django.db.models import Max
blog_list = Blog.objects.filter(is_published=True).values('author').annotate(Max('published_date'))

我认为你应该试试这个:

Blog.objects.filter(is_published=True).order_by('-published_date').order_by('author').distinct('author')

它会给你想要的。 在这里您将获得所有作者的最新博客。

我能够使用以下方法让它工作:

blog_ids = Blog.objects.filter(is_published = True)\
.order_by('author_id', '-published_date')\
.distinct('author_id')\
.values('id', flat=True)

blog_list = Blog.objects.filter(id__in=blog_ids)\
.order_by('-published_date')

这正是我想要的!!!!

可以在此处找到有关此方法的更多详细信息:

试试这个代码 现在这是删除空值

from django.db.models import Max

Blog.objects.filter(pk__in=Blog.objects.order_by('-published_date').values(
        'author_id').annotate(max_id=Max('pk')).values('max_id'),
                        is_published=True, author_id__isnull=False).order_by('-author_id')