Mongoengine: test1 недействителен ObjectId

Появилось следующее сообщение об ошибке:

$ python tmp2.py
why??
Traceback (most recent call last):
 File "tmp2.py", line 15, in <module>
test._id = ObjectId(i[0])
 File "/home/mictadlo/.virtualenvs/unisnp/lib/python2.7/site-packages/bson/objectid.py", line 92, in __init__
self.__validate(oid)
 File "/home/mictadlo/.virtualenvs/unisnp/lib/python2.7/site-packages/bson/objectid.py", line 199, in __validate
raise InvalidId("%s is not a valid ObjectId" % oid)
bson.errors.InvalidId: test1 is not a valid ObjectId
</module>

с этим кодом:

from bson.objectid import ObjectId
from *********** import *


class Test(Document):
 _id = ObjectIdField(required=True)
 tag = StringField(required=True)


if __name__ == "__main__":
connect('dbtest2')
print "why??"
for i in [('test1', "a"), ('test2', "b"), ('test3', "c")]:
 test = Test()
 test._id = ObjectId(i[0])
 test.char = i[1]
 test.save()

Как можно использовать собственные идентификаторы, которые тоже уникальны?

2 ответа

Две вещи:

ObjectId получает 24 шестнадцатеричную строку, вы не можете инициализировать ее этой строкой. Например, вместо использования 'test1' вы можете использовать строку, такую как '53f6b9bac96be76a920e0799' или '111111111111111111111111'. Вам даже не нужно инициализировать ObjectId, вы можете сделать что-то вроде этого:

...
test._id = '53f6b9bac96be76a920e0799'
test.save()
...

Я не знаю, что вы пытаетесь выполнить, используя _id. Если вы пытаетесь создать и поле id или "первичный ключ" для вашего документа, это не обязательно, потому что он создается автоматически. Ваш код будет:

class Test(Document):
 tag = StringField(required=True)

for i in [("a"), ("b"), ("c")]:
 test = Test()
 test.char = i[0]
 test.save()

print(test.id) # would print something similar to 53f6b9bac96be76a920e0799

Если вы настаиваете на использовании поля с именем _id вы должны знать, что ваш id будет таким же, потому что внутри него MongoDB называет его _id. Если вы все еще хотите использовать string1 как идентификатор, вы должны сделать:

class Test(Document):
 _id = StringField(primary_key=True)
 tag = StringField(required=True)


Согласно документации: http://docs.***********.org/apireference.html#fields, ObjectIdField - это "Оболочка полей вокруг объектов MongoDBs ObjectIds". Поэтому он не может принять строку test1 как идентификатор объекта.

Возможно, вам придется изменить код на что-то вроде этого:

for i in [(bson.objectid.ObjectId('test1'), "a"), (bson.objectid.ObjectId('test2'), "b"), (bson.objectid.ObjectId('test3'), "c")]:

для того, чтобы ваш код работал (предположим, что test1 т.д. являются действительными id)

licensed under cc by-sa 3.0 with attribution.