我有一个在我的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。哪一个是有效的?