如果我对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()的工作阻止了这里发生的进一步解除引用?
如果我错了,请纠正我。
答案 0 :(得分:1)
首先是一个警告,这不仅是一个关系模式,而是一个递归关系模式。您可以关注关系并最终加载所有 UserAccount
个对象。
请记住MongoDB中有无连接 - 因此您要求客户端代码(mongoengine)在您的应用程序连接中执行 - 这意味着多个查询然后将结果分配给正确的文档 - 这太贵了。所以请问自己“这是适合这份工作的工具吗?”
然而,您的观察结果是正确的 - 默认情况下select_related()仅关注一个关系,因此对于用户对象,它只会取消引用第一组朋友而不是他们的朋友。您可以通过将其传递到select_related(max_depth=2)
来更改深度。