django中的过滤器:每个用户的最后一篇文章

django中的过滤器:每个用户的最后一篇文章,django,django-models,tastypie,Django,Django Models,Tastypie,我有两个模型,作者和帖子,我如何制作一个过滤器,谁可以在一行中选择每个作者的最后一篇帖子(按id字段)?,对我来说不好的方法是: authors = Author.objects.all() queryset = [] for author in authors: posts = Post.objects.filter(author=author).order_by('-id') if loc: queryset.append(posts[0]) 具体地说,这是

我有两个模型,作者和帖子,我如何制作一个过滤器,谁可以在一行中选择每个作者的最后一篇帖子(按id字段)?,对我来说不好的方法是:

authors = Author.objects.all()
queryset = []
for author in authors:
    posts = Post.objects.filter(author=author).order_by('-id')
    if loc:
        queryset.append(posts[0])
具体地说,这是为了过滤我的Tastypie资源“PostResource”,这个过滤器只能给我每个用户的最后一篇文章,按创建顺序排列

使用okm answer和tastypie自定义过滤器的完整解决方案: 阅读有关在SQL中按组获取顶行的信息

如本文所述,您可以在中使用
,也可以使用
加入

中的
为例:

SELECT * FROM post_table 
WHERE id IN (SELECT MAX(id) AS max_id FROM post_table GROUP BY author_id);
SQL可以在QuerySet中编写为:

Post.objects.filter(pk__in=
    Post.objects.order_by().values('author_id').annotate(
        max_id=models.Max('id')).values('max_id'))
按作者id从post表格组中选择MAX(id)作为MAX(id)的
QuerySet
模式是:

Model.objects.order_by().values(...).annotate(foo=...).values('foo')
^------------^----------^-----------^-----------------^------------^
    \            \           \            \                \
base queryset     \        GROUP BY        \           SELECT column
or manager      remove possible           annotation part
                useless ordering          Min/Max/...
此外,您还可以直接将SQL封装在
queryset.raw()
中。如果选择
JOIN
版本,则
.raw()
方式更清晰


请注意,
中的
子句在您的DB后端可能存在性能问题,如果性能非常关键,您需要分析并调整索引

但我的问题是,如何让所有作者都不重复(在一个ORM调用中获取每个作者的最后一篇文章,这意味着一个没有重复作者的文章列表)这篇文章非常古老,但仍然非常有用。非常感谢。
Post.objects.filter(pk__in=
    Post.objects.order_by().values('author_id').annotate(
        max_id=models.Max('id')).values('max_id'))
Model.objects.order_by().values(...).annotate(foo=...).values('foo')
^------------^----------^-----------^-----------------^------------^
    \            \           \            \                \
base queryset     \        GROUP BY        \           SELECT column
or manager      remove possible           annotation part
                useless ordering          Min/Max/...