У меня есть два класса 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="77@ex.com").save()
user2 = User(user_id=66, email="66@ex.com").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": "77@ex.com"
}
{
"_id" : 66,
"email": "66@ex.com"
}
Как видно, _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'
.
Спасибо.