Django渲染问题:已加载的数据
那是许多模型Django渲染问题:已加载的数据,django,django-templates,many-to-many,eager-loading,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=fi
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 %}
{%fori in faculty.project_set%}
{{i.title}}
{%endfor%}
然后,我收到以下错误消息
'ManyRelatedManager'对象不可编辑
->{%fori in faculty.project_set%}
如何在django模板中呈现急切加载的数据,您会遇到错误,因为项目集是一个管理器,而不是查询集 正如您必须执行
Faculty.objects.all()
或Faculty.objects.filter(…)
而不是简单地执行Faculty.objects
,您需要调用项目集上的方法,如Faculty.objects.all()
在Django模板语言中,您不使用括号来调用该方法,因此可以执行以下操作:
{% for project in faculty.project_set.all %}
这与您是否使用
prefetch\u related
无关。您之所以会收到错误,是因为教员。项目集
是管理者,而不是查询集
正如您必须执行Faculty.objects.all()
或Faculty.objects.filter(…)
而不是简单地执行Faculty.objects
,您需要调用项目集上的方法,如Faculty.objects.all()
在Django模板语言中,您不使用括号来调用该方法,因此可以执行以下操作:
{% for project in faculty.project_set.all %}
这与您是否使用
prefetch\u related
无关。您之所以会收到错误,是因为教员。项目集
是管理者,而不是查询集
正如您必须执行Faculty.objects.all()
或Faculty.objects.filter(…)
而不是简单地执行Faculty.objects
,您需要调用项目集上的方法,如Faculty.objects.all()
在Django模板语言中,您不使用括号来调用该方法,因此可以执行以下操作:
{% for project in faculty.project_set.all %}
这与您是否使用
prefetch\u related
无关。您之所以会收到错误,是因为教员。项目集
是管理者,而不是查询集
正如您必须执行Faculty.objects.all()
或Faculty.objects.filter(…)
而不是简单地执行Faculty.objects
,您需要调用项目集上的方法,如Faculty.objects.all()
在Django模板语言中,您不使用括号来调用该方法,因此可以执行以下操作:
{% for project in faculty.project_set.all %}
这与是否使用
预取相关的无关。替换:
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
)
至:
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 %}
替换:
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
)
至:
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 %}
替换:
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
)
至:
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 %}
替换:
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
)
至:
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 %}
是的,我发现我的查询并没有以渴望的方式加载数据,尽管我使用了预取相关的方法。如果在我的案例中是最佳实践,请进一步解释如何使用具有内部联接的单个查询加载数据。我不理解您的评论。模板中的项目循环与是否使用prefetch\u related
是分开的。在您的情况下,您似乎只有一名教员
成员,因此预回迁相关的
不会为您保存任何查询。要获取教员,最好只能进行一次查询,每个查询都与多对多关系相关。根据我的sql知识,可以通过具有内部join语句的单个查询获取教员信息并加载教员信息及其项目和出版物数据。在这一点上,我提出两个问题。首先,如何用django orm编写该查询。其次,这是django逻辑中的最佳实践(用一个查询加载所有数据)。ORM在理论上并不总是尽可能有效,但您可以获得方便性和可读性。Django的最佳实践是使用ORM,并为每个多对多关系接受一个查询,除非它导致不可接受的性能。我相信手动编写更高效的SQL是可能的。但是,您不能使用ORM来实现这一点,这将使您的代码复杂化。是的,我发现我的查询没有以渴望的方式加载数据,尽管我使用了预回迁。如果在我的案例中是最佳实践,请进一步解释如何使用具有内部联接的单个查询加载数据。我不理解您的评论。模板中的项目循环与是否使用prefetch\u related
是分开的。在您的情况下,您似乎只有一名教员
成员,因此预回迁相关的
不会为您保存任何查询。要获取教员,最好只能进行一次查询,每个查询都与多对多关系相关。根据我的sql知识,可以通过具有内部join语句的单个查询获取教员信息并加载教员信息及其项目和出版物数据。在这一点上,我提出两个问题。首先,如何用django orm编写该查询。其次,这是django逻辑中的最佳实践(用一个查询加载所有数据)。ORM在理论上并不总是尽可能有效,但您可以获得方便性和可读性。Django的最佳实践是使用ORM,并为每个多对多关系接受一个查询,除非它导致不可接受的性能。我相信手动编写更高效的SQL是可能的。但是,您不能使用ORM来实现这一点,这将使您的代码复杂化。是的,我发现我的查询没有以渴望的方式加载数据,尽管我使用了预回迁。如果在我的案例中是最佳实践,请进一步解释如何使用具有内部联接的单个查询加载数据