我有两个类Channel
和User
,它们代表数据库中的两个集合。它们大致定义如下:
from mongoengine import *
class User(Document):
user_id = IntField(primary_key=True)
email = StringField(required=True)
class Channel(Document):
title = StringField(required=True)
subbed = ListField(ReferenceField(User, reverse_delete_rule=CASCADE), default=list)
这两个类都稍微复杂一些,并且具有更多的字段,但是我认为这些与我遇到的问题无关。
如您所见,ReferenceField
将reverse_delete_rule
设置为级联,因此,每当我删除User
文档时,都应在Channel
集合中删除对其的所有引用。但是,正如我所发现的,在User
集合中对Channel
的引用不是正确的ObjectId
引用,而是整数,即:
user1 = User(user_id=77, email="[email protected]").save()
user2 = User(user_id=66, email="[email protected]").save()
chan1 = Channel(title="Global News")
chan1.subbed.append(user1)
chan1.save()
上面的代码在数据库中产生以下Channels
集合:
{
"_id" : ObjectId("5e1ee3c4055cf2d5c7d0e954"),
"title" : "Global News",
"subbed" : [
77
]
}
和User
集合:
{
"_id" : 77,
"email": "[email protected]"
}
{
"_id" : 66,
"email": "[email protected]"
}
如图所示,_id
集合中的User
被别名为user_id
整数字段。将其转换为Channels
集合中的引用时,剩下的唯一“引用”是整数。在reverse_delete_rule
设置为CASCADE
的情况下,这似乎不起作用,因为删除子用户时,出现以下错误:
>>> user1.delete()
mongoengine.errors.ValidationError: '77' is not a valid ObjectId, it must be a 12-byte input or a 24-character hex string
我该如何解决此问题?我尝试导入ObjectId类型和字段,但似乎正在获取ImportError: cannot import name 'ObjectId'
。
谢谢。
但是您使用的是ListField和ReferenceField。要获得您要描述的行为,请考虑OnetoOne
或ManyToOne
(甚至是ForiegnKey字段)。
设置on_delete=CASCADE
毕竟,如果我删除了一个用户,但我不拥有该频道,我希望它会为所有人删除。如果他是作者或所有者。然后考虑更改字段。
或者在delete()
上添加一些自定义逻辑,以得到想要的结果