基于另一个模型的外键过滤列表视图

Filter list view based on foreign key of another model

我有三个模型,主题,主题和学习天数。我想在列表视图中显示学习日,但只显示与同一主题相关的不同主题的学习日。

这是我的模型结构

class Subject(models.Model):
    name = models.CharField(max_length=100, null=False)

 
class Topic(models.Model):
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    name = models.CharField(max_length=100, null=False)

 
class StudyDay(models.Model):
    student = models.ForeignKey(User, on_delete=models.CASCADE)
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    ...
    

我已经在其中一个视图中尝试过此操作,它可以正确过滤,但它会删除之前显示的与学习日相关的数据,因此它无法正常工作。

def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['study'] = context['study'].filter(student=self.request.user)
        context['study'] = Topic.objects.filter(subject=3) # This is the line where I try to filter
        return context

那么问题来了,请问有什么办法可以根据study day的topic属于哪个学科来筛选StudyDay模型中的对象?

我认为您可能想使用 __(双下划线)来访问 filter 中外键的属性。见 Django docs about filtering.

因此,在这种特定情况下,如果您这样做,您可以按主题获得 StudyDays:

context['study'] = StudyDay.objects.filter(student=self.request.user, topic__subject__pk=3)