我的文檔有一些EmbeddedDocumentList,並且每個EmbeddedDocument都應該有自動生成的ObjectId(如_id)字段,因爲我將編寫查詢以通過此_id字段獲取單個EmbeddedDocument。如何用mongoengine在EmbeddedDocument中定義objectid?
如何達到?
我的文檔有一些EmbeddedDocumentList,並且每個EmbeddedDocument都應該有自動生成的ObjectId(如_id)字段,因爲我將編寫查詢以通過此_id字段獲取單個EmbeddedDocument。如何用mongoengine在EmbeddedDocument中定義objectid?
如何達到?
基本上你可以用下面的代碼
from mongoengine import *
from bson.objectid import ObjectId
class MyEmbeddedDocument(EmbeddedDocument):
oid = ObjectIdField(required=True, default=ObjectId,
unique=True, primary_key=True)
...
class MyDocument(Document):
embedded_list = EmbeddedDocumentListField(MyEmbeddedDocument)
...
讓更多地解釋這樣做,
根據documentation您可以添加ObjectIdField到您的模型但是它不是必需的,並primary_key那麼你應該設置該屬性爲真。此外,它不會爲它的每個生成ObjectId,然後導入並將其默認爲ObjectId。
最後一步有點棘手。如果需要解釋,
bson.objectid.ObjectId是生成新的objectids的類。
此外documentation說默認值可以調用,而不是解釋清楚它是如何工作的。
還打着_id爲embeddeddocument是不是最好的命名慣例怎麼一回事,因爲你寫的查詢與雙排下劃線和「_id」名embeddeddocument多了一個下劃線作爲下面的代碼
MyDocument.objects.get(notice___id)
然後mongoengine拋出異常怎麼一回事,因爲的'_id'名字還有一個下劃線。因此,您應該直接將名稱作爲'oid'命名爲objectId或renname'id'的簡短版本或您想要的名稱。