Модель Django с несколькими внешними ключами слишком долго загружается с помощью forms.ModelChoiceField
У меня есть проект django для оценок студентов.
Models.py
class Registration(CMTracking):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
academic_year = models.ForeignKey(AcademicYear, on_delete=models.CASCADE)
school = models.ForeignKey(School, on_delete=models.CASCADE)
grade = models.CharField(max_length=5, choices=Grade.choices)
school_class = models.ForeignKey(SchoolGradeClass, on_delete=models.CASCADE, blank=True, null=True)
last_year_result = models.PositiveSmallIntegerField(choices=RESULT.choices, blank=True, null=True)
last_grade = models.CharField(max_length=5, choices=Grade.choices, null=True)
date_of_join = models.DateField(null=True, blank=True)
type_of_registration = models.PositiveSmallIntegerField(choices=TypeOfRegistration.choices, default=0, null=True)
type_of_attendance = models.PositiveSmallIntegerField(choices=TypeOfAttendance.choices, null=True)
transfer_from = models.PositiveSmallIntegerField(choices=TransferFrom.choices, blank=True, default=1)
status = models.PositiveSmallIntegerField(choices=RequestStatus.choices, default=0)
class Exam(CMTracking):
fa_name = models.CharField(max_length=70, null=False)
en_name = models.CharField(max_length=70, null=False)
ar_name = models.CharField(max_length=70, null=False)
total_mark = models.DecimalField(max_digits=5, decimal_places=2, default=0)
exam_type = models.PositiveSmallIntegerField(choices=ExamType.choices)
academic_year = models.ForeignKey(AcademicYear, on_delete=models.CASCADE)
class ExamSubject(CMTracking):
exam = models.ForeignKey(to=Exam, on_delete=models.CASCADE)
subject = models.ForeignKey(to=SubjectMaster, on_delete=models.CASCADE)
teacher = models.ForeignKey(Staff, related_name='ExamSubjectList', on_delete=models.CASCADE) # Namavar
school_class = models.ForeignKey(SchoolGradeClass, on_delete=models.CASCADE, blank=True, null=True)
min = models.PositiveSmallIntegerField(null=True)
max = models.PositiveSmallIntegerField(null=True)
class MarkDescriptive(CMTracking):
subject = models.ForeignKey(ExamSubject, on_delete=models.CASCADE)
student = models.ForeignKey(Registration, related_name='mark_list_descriptive', on_delete=models.CASCADE)
goal = models.ForeignKey(to=SubjectGoalsMaster, on_delete=models.CASCADE)
point = models.FloatField(null=True, blank=True)
t2point = models.FloatField(null=True, blank=True)
forms.py:
class MarkDescriptiveModelForm2(forms.ModelForm):
student = forms.ModelChoiceField(queryset=Registration.objects.all().select_related('student__person').filter(school_id=106), required=False)
# student = forms.IntegerField() # only shows the id
goal = forms.ModelChoiceField(queryset=SubjectGoalsMaster.objects.all(), required=False)
point = forms.ChoiceField(choices=DescriptivePoint5.choices)
t2point = forms.ChoiceField(choices=DescriptivePoint5.choices)
class Meta:
model = MarkDescriptive
fields = ['id', 'student', 'point', 't2point']
Views.py:
@login_required()
@require_http_methods(['POST', 'GET', 'PUT'])
def mark_descriptive_update(request, exam_subject_id=None, goal_id=None):
subject = get_object_or_404(ExamSubject, id=exam_subject_id)
goal = get_object_or_404(SubjectGoalsMaster, id=goal_id)
MarkFormset = modelformset_factory(MarkDescriptive, form=MarkDescriptiveModelForm2, extra=0)
marks = subject.markdescriptive_set.all().select_related('subject__exam') \
.select_related('student__academic_year') \
.select_related('student__student__person') \
.select_related('goal').select_related('subject__subject').filter(goal=goal)
formset = MarkFormset(request.POST or None, queryset=marks)
add_url = reverse('add-class')
template = 'school/loaders/load_form.html'
form_template = 'school/pages/exam/mark_descriptive/formset.html'
context = {
# 'form': form,
'records': marks,
'subject': subject,
'goal': goal,
'formset': formset,
'template': template, 'form_template': form_template, 'add_url': add_url}
# if request.method == 'PUT':
if request.method == 'POST':
print(f'\n\n\nrequest is {request.method}\n')
print(f'formset data:{formset.data}')
if formset.is_valid():
print('formset is valid')
for form in formset:
updated_mark = form.save(commit=False)
updated_mark.subject = subject
updated_mark.goal = goal
updated_mark.modified_by = request.user
updated_mark.last_modified = datetime.now()
updated_mark.save()
print('*** \n Marks added succefully !\n***')
else:
print(' form not valid', formset.errors)
return render(request, form_template, context)
выпуск ::
student = forms.ModelChoiceField(queryset=Registration.objects.all().select_related('student__person').filter(school_id=106), required=False)
Слишком долго загружается информация о студенте Я пытался переопределить форму, чтобы получить только студентов, которые находятся на том же экзамене, но не смог этого сделать. и в целом мне совсем не нужно, чтобы поле студента было в качестве выбора. обычной метки имени студента полностью достаточно, так как данные уже заполнены и преподаватель будет вводить только точку.