Python mongoengine - 最后一个条目的 GET ID

问题描述

我有一个场景,我需要在我的 mongoDB 中创建几个产品的克隆。我使用以下代码

    for single_product in survey_products:
        cloned_product = without_keys(single_product,{'_id'})
        cloned_product_doc = Product(**cloned_product)
        cloned_product_doc.save()
        print(cloned_product_doc.id)
        print(cloned_product_doc._id)

这会正确创建记录,这很好,但是在两个 print 函数中,即使我在访问 None 之前调用cloned_product_doc.save(),我还是得到了 IDs>

如何获取新条目的 ID

已编辑

这里是模型定义

class Product(Document):
# model
_id = ObjectIdField()
photo = StringField()
name = StringField()
price = FloatField()
currency = StringField()

class Meta:
    db_table = 'product'

解决方法

像下面那样编辑模型定义,确保将 ObjectId 定义为默认值

.........................
from mongoengine import *
from bson import ObjectId
#import objectID to use as default

class Product(Document):
# model
_id = ObjectIdField(default=ObjectId)  # mention default as ObjectId
photo = StringField()
name = StringField()
price = FloatField()
currency = StringField()
class Meta:
    db_table = 'product'
,

在正常使用情况下,Mongoengine在调用.save()时将id添加到实例中。

from mongoengine import *

connect()

class MyDoc(Document):
    # Mongoengine adds an id = ObjectIdField if no 'id' is provided
    s = StringField()

doc = MyDoc(s='garbage').save()
print(doc.id)    # e.g 600df8c3d87af06b92725f87

我建议检查您的 cloned_product 中的内容。也许还有一个剩余的“id”键或干扰默认行为的东西

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...