问题描述
这里的django和django-rest-framework上的新手。请问是否可以在for循环中获得COUNT个唯一值?我遇到过这种用例,在这种情况下,我需要获取for循环查询集上所有唯一值的COUNT。实现是在查询集内循环,并将所有唯一对象放入列表,然后返回其len()。此实现的问题是,它会导致基于django-debug-toolbar的数据库上的多个查询。请参阅下面的代码以供参考。还有另一种方法可以实现吗?预先谢谢你。
activity_list = []
classes = Class.objects.all()
for class in classes:
student_activities = class.studentactivity_set.all()
for activity in student_activities:
if activity not in activity_list:
activity_list.append(activity)
return len(activity_list)
解决方法
最简单的方法是将其变成集合,然后在集合上使用len()
函数。您还可以将元素直接添加到集合中,这样可以避免进行任何额外的比较。
>>> lst = [1,2,3,4,4]
>>> len(lst)
5
>>> st = set(lst)
>>> len(st)
4
>>> st.add(5)
>>> len(st)
5
>>> st.add(5)
>>> len(st)
5
,
您可以借助Django ORM来做到这一点:
activity_count = (StudentActivity.objects
.exclude(related_class=None) # exclude not linked activities
.count() # count unique items
)
我尚未测试此代码,请您自己进行。