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)
У меня есть две коллекции, подобные приведенной выше, которые поддерживают отношения «многие ко многим».
В шаблоне с Angular я устанавливаю переменную javascript в список родителей следующим образом:
$scope.items = {{ parents|tojson }};
Это приводит к массиву Родителей, которые chilren
являются массивом идентификаторов объектов (ссылок), в отличие от разыменованных child
объектов:
$scope.items = [{'$oid': '123', 'name': 'foo', 'children': [{'$oid': '456'}]}];
Я хочу, чтобы этот угловой объект содержал все разыменованные дочерние элементы. Есть ли эффективный способ сделать это?
Пока что это единственный подход, который работает для меня при O (n ^ 3). Я минимизировал понимание списка для ясности. Множественные obj['_id'] = {'$oid': str(obj['_id']}
необходимы для преобразования ObjectId
во что-то, что можно сериализовать в json.
@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))