Django 渲染问题急切加载数据
Django rendering issue eager loaded data
这么多型号
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' 对象不可迭代
-> {% for i in faculty.project_set %}
如何在 django 模板中呈现预先加载的数据
您收到错误是因为 faculty.project_set
是一个管理器,而不是一个查询集。
就像你必须做Faculty.objects.all()
或Faculty.objects.filter(...)
而不是简单地Faculty.objects
一样,你需要在项目集上调用一个方法,比如faculty.objects.all()
在Django模板语言中,调用方法时不使用括号,所以可以这样:
{% for project in faculty.project_set.all %}
这与您是否使用prefetch_related
无关。
替换:
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 %}
这么多型号
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' 对象不可迭代
-> {% for i in faculty.project_set %}
如何在 django 模板中呈现预先加载的数据
您收到错误是因为 faculty.project_set
是一个管理器,而不是一个查询集。
就像你必须做Faculty.objects.all()
或Faculty.objects.filter(...)
而不是简单地Faculty.objects
一样,你需要在项目集上调用一个方法,比如faculty.objects.all()
在Django模板语言中,调用方法时不使用括号,所以可以这样:
{% for project in faculty.project_set.all %}
这与您是否使用prefetch_related
无关。
替换:
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 %}