基于另一个模型的外键过滤列表视图
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)
我有三个模型,主题,主题和学习天数。我想在列表视图中显示学习日,但只显示与同一主题相关的不同主题的学习日。
这是我的模型结构
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)