那些是很多型号
class FacultyMember(models.Model):
# some attributes
@staticmethod
def get_profile_information(id, first_name, last_name):
return get_object_or_404(FacultyMember.objects.filter(
pk=id,
first_name=first_name,
last_name=last_name
).prefetch_related('project_set').prefetch_related('publication_set'))
class Publication(models.Model):
# some attributes
author = models.ManyToManyField(FacultyMember, blank=True)
class Project(models.Model):
# some attributes
researchers = models.ManyToManyField(FacultyMember, blank=True)
这是我的观点
def profile(request, id, first_name, last_name):
return render(request, 'profile.html', {
'faculty': FacultyMember.get_profile_information(
id, first_name, last_name
)
})
我尝试在模板中渲染这些数据,如下面的代码
{% for i in faculty.project_set %}
<li>
{{ i.title }}
</li>
{% endfor %}
比我收到以下错误消息
'ManyRelatedManager'对象不可迭代
- &GT; {%for faculty.project_set%}
如何在django模板中呈现预先加载的数据
答案 0 :(得分:2)
您收到错误是因为faculty.project_set
是管理员,而不是查询集。
正如您必须Faculty.objects.all()
或Faculty.objects.filter(...)
而不仅仅是Faculty.objects
一样,您需要在项目集上调用方法,例如faculty.objects.all()
在Django模板语言中,您不使用括号来调用该方法,因此您可以这样做:
{% for project in faculty.project_set.all %}
这与您是否使用prefetch_related
无关。
答案 1 :(得分:1)
<强>替换强>
FacultyMember.objects.filter(
pk=id,
first_name=first_name,
last_name=last_name
).prefetch_related('project_set').prefetch_related('publication_set')
以强>
FacultyMember.objects.filter(
pk=id,
first_name=first_name,
last_name=last_name
)
在模板中,您可以使用:
{% for i in faculty.project_set.all %}