我的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”)聚合。
答案 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。
但是,您说的是要返回列表,而函数返回的是查询集。哪个是有效的?