如何重构此 django 查询以不选择每个单独的对象?

Posted

技术标签:

【中文标题】如何重构此 django 查询以不选择每个单独的对象?【英文标题】:How can I refactor this django query to not select each individual object? 【发布时间】:2011-03-13 15:51:11 【问题描述】:

这是我的看法:

def rsvp_list(request, id, template="rsvp/rsvp_list.html"): rsvp = RSVP.objects.get(id=id) 返回render_to_response(模板, '参加者':rsvp.attendee_set.all().order_by('email__first_name'), , context_instance=RequestContext(request))

这是我的模板:

% for 参加者 in 参加者 % 参加者.email.get_name 参加者.客人 % endfor %

当请求运行时,模板会为每个与会者运行一个查询,以获取他们的名字和姓氏(获取名称只是将两者放在一起)。这是 django 从模板触发的示例查询:

SELECT `rsvp_email`.`id`, `rsvp_email`.` added`, `rsvp_email`.`first_name`, `rsvp_email`.`last_name`, `rsvp_email`.`address` FROM `rsvp_email` WHERE `rsvp_email `.`id` = 1038

如何检索每个与会者的名字和姓氏是第一个查询而不在模板中循环 400 次?

【问题讨论】:

【参考方案1】:

我应该在文档中进一步阅读。

为了减少稍后将发生在相关对象上的查询,只需使用select_related。所以我的查询变成了:

attendees = rsvp.attendee_set.select_related().all().order_by('email__first_name')

【讨论】:

以上是关于如何重构此 django 查询以不选择每个单独的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何重构此搜索过滤器查询?

重构代码以不使用绝对路径或 URI [关闭]

Django 按顺序连接两个查询集

如何替换此代码段以不使用 attrs?反应和情绪/风格

如何在 Django 模型中使用 celery beat 为每个对象创建单独的任务

Django Pagination - 查询参数(url)