Django REST框架过滤一组项目以仅包括每种类型的最新条目



我有一个在我的API

中返回的对象的列表
SomeCustomModel => {
  itemId: "id",
  relatedItem: "id",
  data: {},
  created_at: "data string" 
}

我想返回一个仅包含唯一相关限制的列表,该列表由最近创建的列表过滤。

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

    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,因此不支持独特的("相关")聚合。

您应该尝试在SQL中执行此操作。您可以使用Subquery来实现这一目标。这是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]))

不幸的是,我没有找到任何可以以django式方式替换Distict()的东西。但是,您可以按照以下方式进行操作:

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

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

有点多的Pythonic。

但是,您说的是要返回列表,但您的功能返回QuerySet。哪一个是有效的?

相关内容

最新更新