Ограничить выбор полем m2m внешнего_ключа

У меня есть эти модели

class SubjectTeacher(models.Model):
    teacher = models.ForeignKey(TeacherProfile, on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    SEMESTER_CHOICES = [("1st", "First Quarter"), ("2nd", 'Second Quarter'), ('3rd', 'Third Quarter'), ('4th', 'Fourth Quarter')]
    semester = models.CharField(choices = SEMESTER_CHOICES, default = "1st", max_length=3)
    students = models.ManyToManyField(StudentProfile, related_name="subjects")
    def __str__(self):
        return f'{self.subject.subject_name}  | {self.teacher.user.first_name}'
    class Meta:
        constraints = [
            UniqueConstraint(fields = ["teacher", "subject"], name = "Unique Subject Teacher")
        ]

class StudentGrade(models.Model):
    subject_teacher = models.ForeignKey("SubjectTeacher", on_delete=models.CASCADE)
    student = models.ForeignKey('StudentProfile', on_delete=models.CASCADE)
    grade = models.IntegerField()



Теперь я хочу, чтобы StudentGrade.student был основан на том, что выбрано (в django-admin) в StudentGrade.subject_teacher

Example:

subject_teacher = <subject1> <subject2> 
selected: <subject1>

student = choices from <subject1>.students

Я уже пытался искать в похожих случаях, например, редактирование ModelForm, но не смог уловить суть.

Если вы хотите использовать модель формы, которая имеет фильтрованный набор запросов, вы можете сделать это следующим образом:

# forms.py

class MyForm(forms.ModelForm):
   def __init__(self, *args, **kwargs):
      self.students = StudentProfile.objects.filter( # your filter )
      super(MyForm, self).__init__(*args, **kwargs)
      self.fields['students'].queryset = self.students

Если вы добавляете оценку студента непосредственно в Django Admin, то он не будет знать, какой subject_teacher вам нужен, и покажет <select> со всеми вариантами. Вам нужно будет указать subject_teacher перед началом работы формы, чтобы фильтр работал так, как вы хотите.

Вернуться на верх