所以我有一个非常简单(简化)的模型
class MyObject(models.Model):
owning_user = models.ForeignKey(User, null=True)
现在在我的一个模板中,我试图迭代这些对象的列表,以确定是否应该显示与此类似的内容
{% for my_object in foo.my_object_set %}
{% if my_object.owning_user.id == user.id %}
Show Me!
{% endif %}
这很好用,但我发现的是查询
my_object.owning_user.id
返回拥有用户的每个字段,然后获取在django调试工具栏中验证的id,并检查连接查询
# django-debug-toolbar states this is repeated multiple times
SELECT ••• FROM "auth_user" WHERE "auth_user"."id" = 1
# The following test code also confirms this
from django.db import connection
conn = connection
bearing_type.owning_user.id
print conn.queries[-1]
现在,由于此查询重复超过1000次并且每次查询需要2ms,因此执行此操作需要2秒 - 当我关心的只是id ...
无论如何,我只能执行查询以获取owning_user
中的ID,而不必查询所有字段?
注意,我在这里努力避免进行原始查询
答案 0 :(得分:4)
如果您使用my_object.owning_user_id
而不是my_object.owning_user
,那么Django将使用该ID而不是查找用户。
在这种情况下,您只需要id,但如果您需要其他用户属性,则可以使用select_related
。在视图中,您可以这样做:
foo.my_object_set.select_related('user')
在模板中,您没有那么多控件,因为您无法传递参数。
{{ foo.my_object_set.select_related }}