【问题标题】:How to calculate sum in django models/views如何在 django 模型/视图中计算总​​和
【发布时间】:2021-01-30 23:50:18
【问题描述】:

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

models.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)

views.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)

【问题讨论】:

    标签: python python-3.x django django-models django-views


    【解决方案1】:

    您可以将credits 和Subjects 的Courses 和request.user 的总和总结为:

    from django.db.models import Sum
    
    total_credit = request.user.course_set.aggregate(
        total_credit=Sum('subject__credit')
    )['total_credit'] or 0

    例如:

    from django.db.models import Sum
    
    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'))
            total_credit = request.user.course_set.aggregate(
                total_credit=Sum('subject__credit')
            )['total_credit'] or 0
    
           context = {
               'test':program_structure,
               'credit':credit,         #this is giving single course total 
               'profile':profile,
               'total_credit' : total_credit
           }
           return render(self.request, 'test.html', context)

    然后在模板中渲染它:

    {{ <b>total_credit</b> }}

    【讨论】:

    • 我如何在我的模板中应用它?
    • @Rafikhan:您可以通过模板中的上下文传递总学分。所以你在get 方法中计算这个,将结果添加到context,然后渲染上下文变量。
    • 哦,我被困住了,你能考虑一下,请在你的回答中添加这个:)
    • course = Course.objects.filter(user=self.request.user).aggregate(total_credit=Sum('subject__credit')) 如果我循环遍历如何获得总数
    • i.stack.imgur.com/dXL08.png 先生,像这张图片一样设计这个模型有什么更好的方法?我的课程模型是否足够?谢谢
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2020-04-18
      • 2018-10-15
      相关资源
      最近更新 更多