首页 > 解决方案 > 如何在 django 模型/视图中计算总​​和

问题描述

我正在尝试为学生制作结果应用程序,有两种模型,一种用于学科,一种用于课程,每门课程都有不止一个具有学科学分的学科,所以我想总结所有学科学分取决于课程,现在我' m 获得单门课程的总科目学分,但是否可以拥有所有课程的科目总学分?因为他/她可以有不止一门课程。例如,一门课程的科目总学分 = 12 另一个学分 = 8 .......所以总学分 = 20 学分 请看图片以及第二个图像模型设计的更好方法有学科的课程并显示学生的总学分没有 想要你在 django 中设计这个模型的建议

模型.py

    class Subject(models.Model):
       user = models.ForeignKey(
                      settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
       name = models.CharField(max_length=50)
       code = models.PositiveIntegerField(unique=True)
       credit = models.IntegerField(blank=True)
       files = models.FileField(upload_to='course/materials/', blank=True)
       status = models.CharField(max_length=15, choices=Subject_Status, blank=True)

    def __str__(self):
        return self.name
        

    class Meta:
        db_table = ''
        managed = True
        verbose_name = 'Subject'
        verbose_name_plural = 'Subjects'


    class Course(models.Model):
         user = models.ForeignKey(
              settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
         name = models.CharField(max_length=200, unique=True)
         prefix = models.CharField(max_length=20)
         code = models.CharField(max_length=20)
         subject = models.ManyToManyField('Subject', related_name='subject_list', blank=True)

         faield = models.ManyToManyField(Subject,related_name='failed_subject_status', blank=True)
         passed = models.ManyToManyField(Subject,related_name='passed_subject_status', blank=True)
         nerver = models.ManyToManyField(Subject,related_name='never_subject_status', blank=True)
         current = models.ManyToManyField(Subject,related_name='curent_subject_status', blank=True)
    
         program = models.ForeignKey('Program', related_name='program_course', on_delete=models.CASCADE, 
                                    blank=True, null=True)

视图.py

    class Program_structure(generic.View):

        def get(self, *args, **kwargs):
            profile = Student.objects.all()
            program_structure = Course.objects.filter(user=self.request.user)
            credit = 
              Course.objects.filter(user=self.request.user).annotate(total_credit=Sum('subject__credit'))

           context = {
            'test':program_structure,
            'credit':credit,         #this is giving single course total 
            'profile':profile,

           }
            return render(self.request, 'test.html', context)

标签: pythonpython-3.xdjangodjango-modelsdjango-views

解决方案


您可以使用聚合来代替注释。

credit = Course.objects.filter(user=self.request.user).aggregate(total_credit=Sum('subject__credit'))

推荐阅读