Django Rest框架过滤一组项以只包含每种类型的最新条目

Django Rest框架过滤一组项以只包含每种类型的最新条目,django,django-rest-framework,Django,Django Rest Framework,我有一个在api中返回的这种结构的对象列表 SomeCustomModel => { itemId: "id", relatedItem: "id", data: {}, created_at: "data string" } 我想返回一个只包含唯一RelatedItemId的列表,该列表由最近创建的列表过滤 我写了这篇文章,它似乎很有效 id_tracker = {} query_set = SomeCustomModel.objects.all()

我有一个在api中返回的这种结构的对象列表

SomeCustomModel => {
  itemId: "id",
  relatedItem: "id",
  data: {},
  created_at: "data string" 
}
我想返回一个只包含唯一RelatedItemId的列表,该列表由最近创建的列表过滤

我写了这篇文章,它似乎很有效

    id_tracker = {}
    query_set = SomeCustomModel.objects.all()
    for item in query_set:
        if item.relatedItem.id not in id_tracker:
            id_tracker[item.relatedItem.id] = 1
        else:
            query_set = query_set.exclude(id=item.id)
    return query_set
我想知道是否有更干净的方法只使用django聚合来编写这篇文章


我使用的是Mysql,因此不支持distinct(“relatedItem”)聚合

不幸的是,我还没有找到任何能以django风格取代distict()的东西。但是,您可以采取以下措施:

list(set(map(lambda x: x.['relatedItem_id'], query_set.order_by('created_at').values('relatedItem_id'))))

这有点像蟒蛇


但是,您的意思是,您希望返回一个列表,但您的函数返回一个queryset。哪个是有效的?

您应该尝试在sql中执行此操作。您可以使用来完成此任务。下面是django文档中的示例

from django.db.models import OuterRef, Subquery
newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')
Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))

我使用的是抽象意义上的列表。QuerySet很好我不明白这对我有什么帮助对不起。这其中的哪一部分是对唯一值进行过滤?上面的例子是获取每个帖子的最新评论。您需要在
query\u set
中的每个
项中找到最新的
相关项。将注释添加到
query\u集
,该注释将使用
relatedItem
子查询
来获取最新值。是的,如果不使用distinct()聚合,我不知道如何执行该操作。在文档示例中,我很容易做到这一点,因为他们只想得到一个最新的值。但我需要获取每个唯一id的最新值。抱歉,我无法帮助您了解您在问题中提供的信息。您需要添加实际的
query\u集
定义和涉及的模型。
from django.db.models import OuterRef, Subquery
newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')
Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))