'Django - How to filter queryset of model, using field two table away

I have three models:

class Classroom(models.Model):
    classroom_subject = models.CharField(max_length=100)
    classroom_code = models.CharField(max_length= 5, default = '00000')
    teacher = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
 
class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    student_name = models.CharField(max_length=100)
    classes = models.ManyToManyField(Classroom, blank = True)

class WorkItem(models.Model):
    classroom = models.ForeignKey(Classroom, on_delete=models.CASCADE)
    work_description = models.CharField(max_length=500)
    date_assigned = models.DateField(auto_now_add=True, blank=True)
    time_assigned = models.TimeField(auto_now_add=True, blank=True)
    submission = models.ForeignKey(UserUpload, null = True, on_delete=models.CASCADE)

I'm trying to return a queryset of WorkItem objects and filter the queryset through self.request.user.

The model WorkItem is related to Classroom, and classroom is related to student.

I have tried:

x = WorkItem.objects.filter(
    classroom__student = self.request.user
    )

Basically the problem is how to reference a field two tables away, because from WorkItem, I need to reference Classroom, then from Classroom I need to reference Student. I don't know how to do this. Thanks for reading my question, any help would be greatly appreciated :).



Solution 1:[1]

@iri has answered this question.

I had:

x = WorkItem.objects.filter(
    classroom__student = self.request.user
    )

The correct filter is:

x = WorkItem.objects.filter(
    classroom__student__user = self.request.user
    )

Using double underscore __ to join related tables, and can be used to reference multiple relationships in the models.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 calvincode123