【问题标题】:Get distinct django objects from queryset sorted by latest从按最新排序的查询集中获取不同的 django 对象
【发布时间】:2020-04-22 13:08:12
【问题描述】:

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

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)

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

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

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

哪个有效除了这会按作者的顺序对所有博客文章进行排序,而不是按发布日期。

以下实际上可以通过切换顺序来解决问题,但这会在 django 中引发错误:

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

我已经检查了与此问题类似的所有问题,但没有遇到可行的解决方案。我认为这个请求应该很简单,但我看不出有什么方法可以实现。

【问题讨论】:

  • 这看起来涉及 2 个模型,我见过类似的问题,但不适用于我的问题。不过我会检查一下并进行测试。
  • 试试这个 from django.db.models import Max Blog.objects.filter(pk__in=Blog.objects.order_by('-published_date').values('auther_id').annotate( max_id=Max ('pk')).values('max_id'), is_publish=true)
  • @GorkhaliKhadka 这看起来几乎成功了!我确实看到了一些独特的作者帖子。但是我遇到了一些问题,例如:并非所有作者都出现了,并且博客文章未按发布日期排序
  • 你的问题解决了吗?
  • @GorkhaliKhadka 谢谢,是的,我发布的答案已解决,但两天内我无法选择最佳答案。我会尝试其他解决方案,看看他们是否做得更好。

标签: django filter sql-order-by django-queryset distinct


【解决方案1】:

我能够使用以下方法使其正常工作:

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

这正是我想要的!!!!

可以在此处找到有关此方法的更多详细信息:https://stackoverflow.com/a/32760239/2990550

【讨论】:

    【解决方案2】:

    我认为你应该试试这个:

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

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

    【讨论】:

    • 好主意,我真的认为这会起作用,但在尝试之后,它只是做了同样的事情: blog_list = Blog.objects.filter(is_published=True).order_by('author', '-published_date').distinct('author')
    • 我正在使用它并且我得到了正确的数据:Appointments.objects.all().order_by('-date').order_by('user_id').distinct('user_id') 我没有知道问题出在哪里。
    • 您确定这与 Appointments.objects.all().order_by('user_id', '-date').distinct('user_id') 给出的结果不同吗?这就是它对我的作用
    • 我使用的是 Postgresql,所以 SQL 的呈现方式可能不同
    • 哥们,我也在用 PSQL
    【解决方案3】:

    试试这个解决方案

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

    【讨论】:

    • 不起作用,这将正确排序博客文章,但它会显示作者的所有文章。我只想要作者的最新帖子。
    • 使用更新后的答案时出现错误,与我在问题中发布的第二行生成的错误相同
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      你可以在官方Djang documentation阅读这篇文章。 根据这篇文章,在 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'))
      

      【讨论】:

      • 我得到错误:'QuerySet'对象没有属性'group_by'
      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 2017-10-22
      • 2020-10-16
      • 2011-09-01
      • 2021-06-06
      • 2011-07-04
      相关资源
      最近更新 更多