ReferenceField с первичным ключом IntField не CASCADE для reverse_delete_rule - PullRequest
0 голосов
/ 15 января 2020

У меня есть два класса 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'.

Спасибо.

...