Django渲染问题急切加载数据

时间:2015-10-13 10:10:46

标签: django django-templates many-to-many eager-loading

那些是很多型号

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模板中呈现预先加载的数据

2 个答案:

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