Django:只想循环_set以获取 pk 值



我一直在试图弄清楚如何使用详细信息视图PK过滤我的模板值。我有一个员工的详细视图。我希望显示员工的主题,然后我希望在其中使用对该主题进行的评估来过滤主题。

到目前为止,我可以显示我的主题名称,并显示每个主题的所有评估。但是,我不想显示所有这些,我只想显示当前员工存在的那些(detailView PK(。正如您在模板中看到的那样,我正在使用_set来建立关系,但我不知道如何将 PK 过滤到该等式中。

例如,我想要什么:

主题1:

评估名称 - 员工约翰尼

评估名称 - 员工约翰尼

例如,我目前拥有的:

主题1:

评估名称 - 员工约翰尼

评估名称 - 员工克里斯

我不要克里斯的评价,我只想过滤主键,所以在这种情况下是约翰尼的评价。

模板

{% for subject in subject_list %}
<a href="">{{ subject.subejctname }}</a>
{% for evaluation in subject.evaluation_set.all %}
<div>
<p>{{ evaluering.ma }} | {{ evaluering.ma.firstname }} | {{ evaluering.ma.lastname }}</p>
</div>
{% empty %}
<p>No evaluations founds.</p>
{% endfor %}
{% endfor %}

视图

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['subject_list'] = Subject.objects.all()
return context

主题模型

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)

反向关系 (subject.evaluation_set( 可以预取,这是一种减少在访问查询集中许多对象的反向关系时进行的数据库查询数量的技术。使用以下查询集时,当您访问subject.evaluation_set.all时,它不会执行额外的数据库访问,因为结果已缓存在每个实例上

Subject.objects.all().prefetch_related('evaluation_set')

可以使用预取对象修改此缓存结果。使用这些可以将subject.evaluation_set.all的内容限制为仅包含所需的结果

Subject.objects.all().prefetch_related(
Prefetch(
'evaluation_set',
queryset=Evaluation.objects.filter(employee=self.employee)
)
)

您的模型结构令人困惑。你能详细说明员工、受试者和评价之间的关系吗?您提到您希望显示员工的主题,但通过您的模型结构,员工只能有一个主题,因为员工通过外键与主题相关。

下面我建议对模型名称和模型结构进行一些更改,以便在模板中检索评估可能更有意义。请随时询问有关模型设计的问题,因为这对于设计视图、模板等至关重要。

另请参阅此处了解模型命名约定
Django 外键引用
Django 模型编码风格 (PEP8(

主题模型

class Subject(models.Model):
id = models.AutoField(primary_key=True)
subject_name = models.CharField(max_length=255, help_text="Indtast navnet på 
faget.")
slug = models.SlugField(max_length=200, unique=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)")
first_name = models.CharField(max_length=30, help_text="Indtast medarbejderens fornavn.")
last_name = models.CharField(max_length=30, help_text="Indtast medarbejderens efternavn.")
subjects = models.ManyToManyField(Subject, related_name='employee', through='Evaluation')

评估模型

class Evaluation(models.Model):
name = models.CharField(blank=True,max_length=50)
employee = models.ForeignKey('Employee', on_delete=models.CASCADE)
subject = models.ForeignKey('Subject', on_delete=models.CASCADE)

因此,假设员工可以有不同的主题,并且映射是通过使用多对多的通过模型定义的。

然后,您的DetaiView可以只是

class EmployeeDetailView(DetailView):
template_name = 'evalsys/employee/alle_employees_eval.html'
model = Employee
def get_context_data(self, **kwargs):
context = super(EmployeeDetailViewDetailView, 
self).get_context_data(**kwargs)
context['evaluations'] = Evaluation.objects.filter(employee=self.object)
return context

模板

{% for evaluation in evaluations %}
<a href="">{{ evaluation.subject.subject_name }}</a>
<p>{{ evaluation.name }} | {{ evaluation.employee.first_name }} |
{{evaluation.employee.last_name }}</p>
{% empty %}
<p>No evaluations founds.</p>
{% endfor %}

最新更新