我正在尝试将第一个对象保存到集合中(我做了db.connection.drop_database()以确保它是第一个对象),但我不断收到*** NotUniqueError: Tried to save duplicate unique keys
错误。
以下是我得到的一个简单示例:
ipdb> Card.objects.all()
[]
ipdb> card
`<Card: <Card url/pk: c569e1c9-7311-441e-ba03-0e86d4bc2932>>`
ipdb> card.save()
*** NotUniqueError: Tried to save duplicate unique keys (E11000 duplicate key error index: contacts.dav_object.$username_1 dup key: { : null })
ipdb> Card.drop_collection()
ipdb> card.save()
`<Card: <Card url/pk: c569e1c9-7311-441e-ba03-0e86d4bc2932>>`
ipdb>
我正在使用UnitTest,setUp
方法有Card.ensure_indexes()
。我怀疑它与它有关,但如果没有这一行,Mongo将接受重复的条目,即使模型定义为unique=True
。
如果我在Card._collection.drop_indexes()
之后添加Card.ensure_indexes()
此问题消失了,那么我会得到重复的条目,就像我上面说的那样。
这是卡片型号:
class Card(DavObject):
addressbook = db.ReferenceField("Addressbook")
url = db.StringField(required=True, unique=True, unique_with=["addressbook", "url"])
active = db.BooleanField(default=True)
text = db.StringField(required=True)
这是DavObject:
class DavObject(db.Document):
meta = {
'allow_inheritance': True,
}
last_update = db.ComplexDateTimeField(required=True, default=datetime.utcnow)
def __unicode__(self):
return u"<%s url/pk: %s>" % (self.__class__.__name__, getattr(self, "url", self.pk))
def save(self, *args, **kwargs):
if self._get_changed_fields():
self.last_update = datetime.utcnow()
return db.Document.save(self, *args, **kwargs)
我无法弄清楚出了什么问题。
我使用的是mongoengine 0.8.3,烧瓶0.10.1和python 2.7.3。
答案 0 :(得分:3)
看起来像继承问题:为'allow_inheritance': True
设置DavObject
这意味着所有继承的模型都将存储在一个集合中。
对于从username
继承的某些模型,您有DavObject
索引,当您尝试从具有相同DavObject
(无)的username
文档继承的插入2时,它会发生冲突。< / p>
如果您不需要使用'allow_inheritance': True
而不是将其设置为False
,或者尝试将具有不同索引的文档放入单独的集合中。
要检查我的假设,请尝试print list(DavObject.objects.all())
。