从按最新排序的查询集中获取不同的 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')
我有这个模型(隐藏了不相关的字段):
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')