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 %}