Как обновить поле в базе данных Django? - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно обновить общий балл моего ученика для моего приложения, но проблема в том, что я не могу обновить это значение.

Модели:

class Student(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    quizzes = models.ManyToManyField(Quiz, through='TakenQuiz')
    total_score = models.FloatField(default=0)

    def __str__(self):
        return self.user.username

    class Meta:
        verbose_name = 'Estudantes'

Obs: tota_score имеет значение по умолчанию= 0

просмотров:

class TakenQuizListView(ListView):

model = TakenQuiz
context_object_name = 'taken_quizzes'
template_name = 'classroom/students/taken_quiz_list.html'

def get_queryset(self):        
    queryset = self.request.user.student.taken_quizzes \
        .select_related('quiz', 'quiz__subject') \
        .order_by('quiz__name')
    return queryset

def get_context_data(self, **kwargs):
    total_score = self.request.user.student.total_score
    total_score  = Student.objects.get(total_score= 
  self.request.user.student.total_score)
    total_score = TakenQuiz.objects.aggregate(Sum('score'))
    total_score.save() #try update
    student = self.request.user.student

    context = super().get_context_data(**kwargs)
    context['total_score'] =  total_score['score__sum'] 
    return context

Я могу получить полный балл, но не могу обновить поле в моделях.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Здесь есть несколько неправильных вещей.

Во-первых, вам нужно рассчитать общий балл только для тестов, которые были выполнены учеником, а не всеми:

student = self.request.user.student
total_score = TakenQuiz.objects.filter(student=student).aggregate(Sum('score'))

Теперь вам нужно обновить запись студента этим значением:

student.total_score = total_score['score__sum'] 
student.save()

Наконец, вам нужно поместить это где-то лучше, чем get_context_data для ListView.Это совсем не то место.Это, вероятно, должно быть вызвано, когда студент отправляет свой счет для текущей викторины.

1 голос
/ 03 апреля 2019

На вашем total_score = TakenQuiz.objects.aggregate(Sum('score')) вы не выбираете никаких данных. Сначала используйте объект get, затем обновите его. Кроме того, вы делаете это в ListView, но не уверены, что это лучшее рекомендуемое место для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...