#python #python-3.x #django #django-models #django-views
#python #python-3.x #django #django-модели #django-представления
Вопрос:
Я пытаюсь создать приложение результатов для студентов, есть две модели, одна для предмета, одна для курса, в каждом курсе есть более одного предмета с зачетом по предмету, поэтому я хочу суммировать все зачеты по предмету в зависимости от курса, теперь я получаю общий предметный зачет по одному курсу, но так ли этовозможно ли получить общий зачет по всем предметам курса? потому что у него / нее может быть более одного курса. например, предмет одного курса общий кредит = 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)
Ответ №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'))