【问题标题】:how to sum in django model fields如何在 django 模型字段中求和
【发布时间】:2020-10-13 18:55:32
【问题描述】:

我这里有两个模型,一个包含主题信息,另一个包含课程信息,我想总结这门课程有多少学分(总),以显示在模板中。我试过但没有用。 非常感谢

class Course(models.Model):
    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)

def tota_credit(self):
    total = 0
    for cred in self.subject_set.all():
        total += cred.credit
    return total  # doesn't work :(


def __str__(self):
    return self.name

另一个模型

class Subject(models.Model):
   name = models.CharField(max_length=50)
   code = models.PositiveIntegerField(unique=True)
   credit = models.IntegerField(blank=True)

def __str__(self):
    return self.name 

views.py

class Course_detail(generic.DetailView):
    model = Course
    template_name = 'course_detail.html'
    context_object_name = 'queryset'


def get_context_data(self, **kwargs):
    self.profile = Student.objects.all()
  
    context = super().get_context_data(**kwargs)
    context['profile'] = self.profile
    return context

【问题讨论】:

  • 究竟是什么不起作用?
  • 只需要课程的总学分例如:一门课程包含五个科目,所以会有5个不同的学分没有,比如2,3,5,我想要总= 10,我怎么能有这笔钱

标签: python django django-models django-views django-templates


【解决方案1】:

您不需要自己执行这些计算。你可以.annotate(…) [Django-doc]查询集:

from django.db.models import Sum

class Course_detail(generic.DetailView):
    model = Course
    template_name = 'course_detail.html'
    queryset = Course.objects.annotate(
        total_credit=Sum('subject__credit')
    )
    context_object_name = 'queryset'

    # …

然后你可以用:

{{ queryset }}: {{ queryset<b>.total_credit</b> }}

【讨论】:

  • 它在 /student/department/program/course/details/3/ 'Course' 对象上显示错误 TypeError 是不可迭代的,为什么?我认为你的ans应该可以工作,但我不明白:(
  • @Rafikhan: 因为它是一个DetailView,所以queryset 不是查询集,而是一个Course 对象。因此,您使用{{ queryset }}: {{ queryset.total_credit }} 渲染它。尽管context_object_name 的值具有误导性。
  • 我现在该怎么办?我该如何解决?,感谢您的帮助,感谢
  • @Rafikhan:您使用{{ queryset }}: {{ queryset.total_credit }} 渲染单个对象,因此没有{% for ... %} 循环。
  • 爱你,先生 :) 我无话可说,非常感谢。
【解决方案2】:
from django.db.models import Sum

...
def tota_credit(self):
  return self.subject_set.aggregate(Sum('credit'))['credit_sum']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2017-08-26
    • 2021-11-14
    • 2011-10-08
    相关资源
    最近更新 更多