I have two models SchoolClass and Student, which have a many-to-many relationship through an Enrolment model.
class Student(models.Model):
name = models.CharField(max_length=100)
code = models.CharField(max_length=10)
class SchoolClass(models.Model):
code = models.CharField(max_length=100)
cycle = models.ForeignKey(Cycle)
students = models.ManyToManyField(Student,through='Enrolment')
class Enrolment(models.Model):
student = models.ForeignKey(Student)
school_class = models.ForeignKey(SchoolClass)
The SchoolClass model has a field cycle (which is the year+semester that class runs in. When I view a student in the admin, I'd like to see the classes that student is enrolled in only for a given cycle (e.g. the current cycle)
I had previously had the cycle field in the Enrolment model, and the following worked nicely:
class StudentEnrolmentsInlineFormSet(BaseInlineFormSet):
def get_queryset(self):
if not hasattr(self, '_queryset'):
qs = super(StudentInlineFormSet, self).get_queryset().filter(cycle=Current)
self._queryset = qs
return self._queryset
class StudentEnrolmentsInline(admin.TabularInline):
model = Enrolment
formset = StudentEnrolmentsInlineFormSet
class StudentAdmin(admin.ModelAdmin):
form = StudentForm
inlines = (StudentEnrolmentsInline,)
However, I've moved the cycle in the the SchoolClass model, and now can't work out how to apply the filter through to the next model.
Unless I'm overlooking something, you can do this with the queryset
method on StudentEnrolmentsInline:
def queryset(self, request):
current = Cycle.objects.latest() # or whatever to get the current cycle
qs = super(StudentEnrolmentsInline, self).queryset(request)
return qs.filter(school_class__cycle=current)