使用select_related()后发生Mongoengine引用

时间:2013-11-26 17:38:09

标签: django mongodb mongoengine

如果我对select_related()的理解完全错误,这可能是一个愚蠢的问题。

这是我的数据库设计。

class UserAccount(Document):
    first_name = StringField(max_length = 20)
    last_name = StringField(max_length = 20)
    user_name = StringField(max_length = 20) 
    friends = ListField(ReferenceField('self'))

查询集是:

u = UserAccount.objects.get(user_name="something").select_related()

我已将结果传递给了你' u'到Django模板。所以我在模板中尝试了这个。

{% for friend in u.friends %}
    {% for f in friend.friends %}
        {{ f.friends }}
    {% endfor %}
{% endfor %}

我能够在浏览器中看到朋友的朋友。是不是select_related()的工作阻止了这里发生的进一步解除引用?

如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:1)

首先是一个警告,这不仅是一个关系模式,而是一个递归关系模式。您可以关注关系并最终加载所有 UserAccount个对象。

请记住MongoDB中有无连接 - 因此您要求客户端代码(mongoengine)在您的应用程序连接中执行 - 这意味着多个查询然后将结果分配给正确的文档 - 这太贵了。所以请问自己“这是适合这份工作的工具吗?

然而,您的观察结果是正确的 - 默认情况下select_related()仅关注一个关系,因此对于用户对象,它只会取消引用第一组朋友而不是他们的朋友。您可以通过将其传递到select_related(max_depth=2)来更改深度。