Django Rest Framework过滤一组项目以仅包括每种类型的最新条目

时间:2019-03-21 20:29:21

标签: django django-rest-framework

我的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”)聚合。

2 个答案:

答案 0 :(得分:1)

您应该尝试在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]))

答案 1 :(得分:0)

不幸的是,我还没有发现任何可以像django一样替换distict()的东西。但是,您可以按照以下方式进行操作:

bcp

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

有些Pythonic。

但是,您说的是要返回列表,而函数返回的是查询集。哪个是有效的?