带有IntField主键的ReferenceField不能在reverse_delete_rule上进行CASCADE

问题描述 投票:0回答:1

我有两个类ChannelUser,它们代表数据库中的两个集合。它们大致定义如下:

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)

这两个类都稍微复杂一些,并且具有更多的字段,但是我认为这些与我遇到的问题无关。

如您所见,ReferenceFieldreverse_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'

谢谢。

python python-3.x mongodb mongoengine
1个回答
-1
投票

但是您使用的是ListField和ReferenceField。要获得您要描述的行为,请考虑OnetoOneManyToOne(甚至是ForiegnKey字段)。

设置on_delete=CASCADE

毕竟,如果我删除了一个用户,但我不拥有该频道,我希望它会为所有人删除。如果他是作者或所有者。然后考虑更改字段。

或者在delete()上添加一些自定义逻辑,以得到想要的结果

© www.soinside.com 2019 - 2024. All rights reserved.