Я пытаюсь загрузить тестовые приборы из файла json в моих тестовых прогонах (чтобы соответствовать схожему стилю загрузки приборов, используемому в Django).Это код, который я получил до сих пор:
from django.utils import simplejson as json
from mongoengine import base as mongobase
from mongoengine import connect
from pymongo import json_util
db = connect("DATABASENAME")
# Clear out the current collections.
for collection in db.collection_names():
if collection == 'system.indexes':
continue
db.drop_collection(collection)
# Open json fixtures
f = open('path/to/test_fixtures.json', 'r')
datas = json.loads(f.read(), object_hook=json_util.object_hook)
# For each serialised model instance, loop through and save to the database.
for data in datas:
print data
if data['_cls'] not in mongobase._document_registry:
print "Skipping %s" % data['_cls2']
continue
model = mongobase._document_registry[data['_cls']]
model_instance = model._from_son(data)
model_instance.save(force_insert=True)
Это, как правило, работает, однако, когда одна из моделей имеет ReferenceField, происходит сбой.Жаловаться на дубликат ключа.Вы заметите, что там есть оператор print, чтобы показать содержание dict, в примере выполнения я получу следующий вывод, который все выглядит нормально до ошибки
{u'_types': [u'Account'], u'status': u'ok', u'name': u'Alice', u'local_id': u'3', u'_cls': u'Account', u'members': [], u'_id': ObjectId('4f17f0855585d32457000001'), u'email': u'alice@example.com', u'permissions': []}
{u'_types': [u'Account'], u'status': u'ok', u'name': u'Bob', u'local_id': u'2', u'_cls': u'Account', u'members': [], u'_id': ObjectId('4f17f0855585d32457000000'), u'email': u'bob@example.com', u'permissions': []}
{u'_types': [u'Account'], u'status': u'ok', u'name': u'company', u'_cls': u'Account', u'members': [], u'_id': ObjectId('4f17f0855585d32457000002'), u'email': u'org@example.com', u'permissions': []}
{u'_types': [u'Membership'], u'parent_account': DBRef(u'account', ObjectId('4f17f0855585d32457000002')), u'member': DBRef(u'account', ObjectId('4f17f0855585d32457000001')), u'role': u'member', u'_cls': u'Membership', u'_id': ObjectId('4f17f0855585d32457000003')}
Наконец, ошибка:
Traceback (most recent call last):
File "/home/vagrant/.virtualenvs/engineclub/lib/python2.6/site-packages/django/test/testcases.py", line 292, in __call__
self._pre_setup()
File "/home/vagrant/.virtualenvs/engineclub/lib/python2.6/site-packages/django/test/testcases.py", line 259, in _pre_setup
self._fixture_setup()
File "/vagrant/engineclub/engineclub/apps/notifications/tests.py", line 67, in _fixture_setup
model_instance.save(force_insert=True)
File "/home/vagrant/.virtualenvs/engineclub/lib/python2.6/site-packages/mongoengine/document.py", line 177, in save
_refs=_refs)
File "/home/vagrant/.virtualenvs/engineclub/lib/python2.6/site-packages/mongoengine/document.py", line 183, in save
raise OperationError(message % unicode(err))
OperationError: Tried to save duplicate unique keys (E11000 duplicate key error index: test_aliss.account.$_id_ dup key: { : ObjectId('4f17f0855585d32457000001') })
Похоже, что он жалуется на дубликат ключа в учетной записи. $ id при вставке членства экземпляра, который имеет ссылку только на коллекцию учетных записей.
Дайте мне знать, если есть какая-либо другая информация, которую я могу включить, однако я бы добавил файл JSON, он очень похож на печатные документы (и имеет только 3 аккаунта, за которыми следует одно членство).Одна вещь, которую я заметил, когда я удаляю force_insert из сохранения, похоже, он вообще ничего не сохраняет (и, таким образом, кажется, что он прошел нормально).