Как вычислить сумму в моделях / представлениях django

#python #python-3.x #django #django-models #django-views

#python #python-3.x #django #django-модели #django-представления

Вопрос:

Я пытаюсь создать приложение результатов для студентов, есть две модели, одна для предмета, одна для курса, в каждом курсе есть более одного предмета с зачетом по предмету, поэтому я хочу суммировать все зачеты по предмету в зависимости от курса, теперь я получаю общий предметный зачет по одному курсу, но так ли этовозможно ли получить общий зачет по всем предметам курса? потому что у него / нее может быть более одного курса. например, предмет одного курса общий кредит = 12, еще один кредит = 8 ……. итого = 20 кредитов пожалуйста, посмотрите Изображения курсы с темой и указанием общего количества кредитов, не предоставленных студентом хотите ваше предложение по разработке этой модели в djangoи какой будет лучший подход для второго дизайна модели изображения

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)
  

Ответ №1:

Вы можете суммировать общее credit количество s из Subject s из Course s 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)  

а затем отобразить его в шаблоне с помощью:

 {{ total_credit }}  

Комментарии:

1. как мне применить это в моих темпатах?

2. @Rafikhan: вы можете передать общий кредит через контекст в вашем шаблоне. Итак, вы вычисляете это в get методе, добавляете результат в context , и отображаете контекстную переменную.

3. о, я так застрял, не могли бы вы рассмотреть, пожалуйста, добавьте это в свой ответ, пожалуйста 🙂

4. course = Course.objects.filter(user= self.request.user).aggregate(total_credit=Sum(‘subject__credit’)) если я пройду цикл, как можно получить общее

5. i.stack.imgur.com/dXL08.png сэр, какой был бы лучший подход для разработки этой модели, подобной этому изображению? достаточно ли для этого моей модели курса? Спасибо

Ответ №2:

Вместо аннотирования вы можете использовать агрегат.

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