Ограничить выбор полем 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
перед началом работы формы, чтобы фильтр работал так, как вы хотите.