从外键中选择单个字段

3

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

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次,每次查询需要2毫秒,所以仅仅执行这个查询就需要花费2秒钟的时间 - 而我只关心id...

是否有任何方法可以只从owning_user中执行一个查询,以获取仅仅id,而不必查询所有字段?

注意,我在尽力避免进行原始查询。

1个回答

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

哦,哇,有些日子我就是喜欢Django... 谢谢!关于你的补充,我知道select_related,但是由于模板方面的问题让我无能为力,而且我也认为我不需要它,因为我不想在那里放太多逻辑 :) - Sayse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接