class Parent(document):
name = StringField()
children = ListField(ReferenceField('Child'))
class Child(document):
name = StringField()
parents = ListField(ReferenceField(Parent))
@app.route('/home/')
def home():
parents = Parent.objects.all()
return render_template('home.html', items=parents)
上記に似た 2 つのコレクションがあり、多対多の関係を維持しています。
Angular のテンプレートでは、javascript 変数を次のように親のリストに設定しています。
$scope.items = {{ parents|tojson }};
chilren
これにより、参照解除されたオブジェクトではなく、オブジェクト ID (参照) の配列である親の配列が生成されchild
ます。
$scope.items = [{'$oid': '123', 'name': 'foo', 'children': [{'$oid': '456'}]}];
この角度オブジェクトに、参照解除されたすべての子を含めたいと思います。これを行う効率的な方法はありますか?
これまでのところ、これが O(n^3) で機能する唯一のアプローチです。わかりやすくするために、リスト内包表記を最小化しました。を json にシリアル化できるものobj['_id'] = {'$oid': str(obj['_id']}
に変換するには、倍数が必要です。ObjectId
@app.route('/home/')
def home():
parents = Parent.objects.all()
temps = []
for parent in parents:
p = parent.to_mongo()
# At this point, the children of parent and p are references only
p['_id'] = {'$oid': str(p['_id'])
temp_children = []
for child in parent.children:
# Now the child is dereferenced
c = child.to_mongo()
c['_id'] = {$oid': str(c['_id'])}
# Children have links back to Parent. Keep these as references.
c['parents'] = [{'oid': str(parent_ref)} for parent_ref in c['parents']]
temp_children.append(c)
p['children'] = temp_children
temps.append(parent.to_mongo())
return render_template('home.html', items=temps)
以下は機能しませんが、逆参照されていない子になります。
json.loads(json.dumps(accounts))