首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算具有公共列表中的参数的实例数

计算具有公共列表中的参数的实例数
EN

Stack Overflow用户
提问于 2021-04-28 23:56:16
回答 2查看 55关注 0票数 1

我正在开发一个应用程序来记录一所学校的情况,我正在努力弄清楚每门课程有多少学生。我的应用程序的结构是这样的:

代码语言:javascript
复制
class Course(models.Model):
    LEVELS = (
        ('A0', 'A0'),
        ('A1', 'A1'),
        ('B0', 'B0'),
        ('B1', 'B1'),
        ('C1', 'C1'),
        ('C2', 'C2'),
    )
    name = models.CharField(max_length=32)
    level = models.CharField(max_length=2, choices=LEVELS)

class Student(models.Model):
    name = models.CharField(max_length=32)
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    course = models.ManyToManyField(Course)

因此,API中的学生看起来如下所示:

代码语言:javascript
复制
[
{
        "id": 1,
        "name": "Diego",
        "school": 2,
        "course": [8, 11]
    },
    {
        "id": 2,
        "name": "Garry",
        "school": 2,
        "course": [4]
    },
    {
        "id": 3,
        "name": "Dr Henrick",
        "school": 2,
        "course": [8]
    },
]

现在,问题出现在我的序列化程序中,在这里,我希望得到每个课程的计数,理想的情况是在这样的dict结构中:

代码语言:javascript
复制
{ 8: 2, 11: 1, 4: 1}

我所做的就是从数据库中获取所有的学生,并循环他们的课程列表,但是我想知道我是否可以用Django的查询系统来做类似的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-29 00:07:29

您可以在提取所有课程信息之后使用collections.Counter

代码语言:javascript
复制
from collections import Counter

students = [
    {
        "id": 1,
        "name": "Diego",
        "school": 2,
        "course": [8]
    },
    {
        "id": 2,
        "name": "Garry",
        "school": 2,
        "course": [1, 8]
    },
    {
        "id": 3,
        "name": "Dr Henrick",
        "school": 2,
        "course": [8]
    },
]

print(dict(Counter([course for y in [x["course"] for x in students] for course in y])))

输出:

代码语言:javascript
复制
{8: 3, 1: 1}   
票数 3
EN

Stack Overflow用户

发布于 2021-04-29 00:45:43

Django的querysets有一个注解法,用于向结果添加聚合。文档中的更多示例。在这种情况下,您需要一组课程的查询,对课程中的学生数量进行注释。

代码语言:javascript
复制
from django.db.models import Count

courses = Course.objects.annotate(student_count=Count('students'))

这为您提供了一个当然实例的查询集,每个实例都有一个student_count属性。如果你真的想把它变成course.id: student_count的字典,你可以这样做:

代码语言:javascript
复制
{course.id: course.student_count for course in courses}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67309341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档