使用for循环在Django queryset上获取COUNT个唯一值

问题描述

这里的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
)

我尚未测试此代码,请您自己进行。