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") ] }
posted @ 2020-07-08 10:41  昵称不能为空voidf  阅读(190)  评论(0)    收藏  举报