Django:过滤一个模型记录以显示其他模型的所有记录

Posted

技术标签:

【中文标题】Django:过滤一个模型记录以显示其他模型的所有记录【英文标题】:Django: Filtering one models records to show all records of other model 【发布时间】:2020-02-03 02:52:28 【问题描述】:

我正在尝试从我的模型主题中过滤所有主题,然后从我的其他模型评估中显示该主题内的所有评估,该模型评估也是特定员工的模型。

因此,当我单击从我的主题模型中获取的主题时,我想获取该主题中该员工的所有评估。我认为每个主题都是按钮或锚标签,单击时会显示该主题内的评估。

主题模型

class Subject(models.Model):
   id = models.AutoField(primary_key=True)
   subjectname = models.CharField(max_length=255, help_text="Indtast navnet på faget.")
   slug = models.SlugField(max_length=200, unique=True)

评估模型

class Evaluation(models.Model):
   id = models.AutoField(primary_key=True)
   employee_num = models.ForeignKey('Employee', on_delete=models.CASCADE, null=True)
   subjectname = models.ForeignKey('Subject', on_delete=models.CASCADE, null=True)

员工模型

class Employee(models.Model):
   id = models.AutoField(primary_key=True)
   slug = models.SlugField(max_length=200)
   employee_num = models.IntegerField(help_text="Indtast medarbejderens MA-nummer. (F.eks 123456)")
   firstname = models.CharField(max_length=30, help_text="Indtast medarbejderens fornavn.")
   lastname = models.CharField(max_length=30, help_text="Indtast medarbejderens efternavn.")
   subjectname = models.ForeignKey('Subject', on_delete=models.CASCADE, null=True)

员工主题视图

class EmployeeDetailView(DetailView):
    template_name = 'evalsys/employee/alle_employees_eval.html'
    model = Employee

    # Uses employee PK to make a detail view
    def view_employee_with_pk(self, pk=None):
        if pk:
            employee = Employee.objects.get(pk=pk)
        else:
            employee = self.employee
        args = 'employee': employee, 
        return render(self, 'evalsys/employee/alle_employees_eval.html', args)

    def get_context_data(self, **kwargs):
        context = super(EmployeeDetailViewDetailView, self).get_context_data(**kwargs)
        context['evaluation'] = Evaluering.objects.all()
        context['subject_list'] = Subject.objects.all()
        context['eval_list'] = Evaluering.objects.all().filter(ma=self.object)
        return context

模板

所以在我的模板中我会有类似的内容:

% for subject in subject_list %
    <a href=""> subject.subjectname </a>
% endfor %

从那时起,我真的不知道如何过滤东西了。 希望它是有道理的,我翻译并从代码中删除了不相关的信息,所以请问是否有什么没有意义。

【问题讨论】:

【参考方案1】:

您可以通过执行以下操作获取与模板中的主题相关的评估:

% for subject in subject_list %
    <a href=""> subject.subjectname </a>
    % for evaluation in subject.evaluation_set.all %
        <span> evaluation </span>
    % endfor %
% endfor %

您可以对任何其他外键执行类似的操作。

【讨论】:

这太棒了 - 非常感谢。除非单击主题,否则您对隐藏内容有什么建议吗?假设一些 if 语句?嗯 有一件事,按照你上面所说的,我会得到所有的评价,而不是过滤员工的PK,我如何添加它来只显示特定员工的? 您可能希望使用 javascript 隐藏基于点击事件的内容。要获取特定员工,请直接从视图中传入该员工,然后使用相同的方法。您不应该在模板中进行过滤。

以上是关于Django:过滤一个模型记录以显示其他模型的所有记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ajax 按钮过滤 Django 模型

Django过滤与其他模型的外键相关的模型的查询集?

Django Admin:如何过滤特定范围值的整数字段

如何以 django 形式过滤多对多字段

构建请求 URL 以通过同一字段多次过滤 Django 查询集

如何在 Django 模板中显示我过滤对象的其他条目