从外键

时间:2015-09-30 15:19:31

标签: django

所以我有一个非常简单(简化)的模型

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,而不必查询所有字段?

注意,我在这里努力避免进行原始查询

1 个答案:

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