MongoEngine reverse_delete_rule
我知道你查这篇文章的时候肯定就说明你自己不想测试
注意这里用的是flask_mongoengine下的MongoEngine进行测试,虽然其实跟MongoEngine单独开出来是一样的
用中文表名会出问题,在我的机器下所有的操作都变成1
各个数字的友好变量名这里不再赘述,只根据数字简单讲一下功能(即结论)
reverse_delete_rule ==> 引用对象被删除时:
0.啥也不干
1.将所有对此的引用空化(整个List,装有本实例的引用的字段都会被爆破,但是文档本身不会爆破)
2.删除引用此的文档(是整个删除不是只删引用,一旦文档和引用扯上关系就整个直接爆破
3.如果有别的东西引用这个,阻止删除操作
4.如果你装在ListField里,相当于pop了这个元素(这个基本上是只给ListField套ReferenceField用的,而且我觉得挺实用的)
附个人测试用代码:
from flask_mongoengine import MongoEngine
db = MongoEngine()
db.connect('xiajibagao')
class User(db.Document):
name = db.StringField()
class t(db.Document):
uu = db.ListField(db.ReferenceField(User,reverse_delete_rule=4))
class c(db.Document):
uu = db.ReferenceField(User,reverse_delete_rule=1)
u1 = User(name='1').save()
u2 = User(name='2').save()
s = t(uu=[]).save()
ss = t(uu=[u1]).save()
sss = t(uu=[u2,u1]).save()
c1 = c(uu=u2).save()
User.objects(name='2').first().delete()
结果:(前两个查询是删前,后两个查询是删后)
> db.t.find()
{ "_id" : ObjectId("5f052d9184fe843a3230887d"), "uu" : [ ] }
{ "_id" : ObjectId("5f052d9184fe843a3230887e"), "uu" : [ ObjectId("5f052d9184fe843a3230887b") ] }
{ "_id" : ObjectId("5f052d9484fe843a3230887f"), "uu" : [ ObjectId("5f052d9184fe843a3230887c"), ObjectId("5f052d9184fe843a3230887b") ] }
> db.user.find()
{ "_id" : ObjectId("5f052d9184fe843a3230887b"), "name" : "1" }
{ "_id" : ObjectId("5f052d9184fe843a3230887c"), "name" : "2" }
> db.user.find()
{ "_id" : ObjectId("5f052d9184fe843a3230887b"), "name" : "1" }
> db.t.find()
{ "_id" : ObjectId("5f052d9184fe843a3230887d"), "uu" : [ ] }
{ "_id" : ObjectId("5f052d9184fe843a3230887e"), "uu" : [ ObjectId("5f052d9184fe843a3230887b") ] }
{ "_id" : ObjectId("5f052d9484fe843a3230887f"), "uu" : [ ObjectId("5f052d9184fe843a3230887b") ] }