Mongodb MongoEngine GenericReferenceField高级查询

Mongodb MongoEngine GenericReferenceField高级查询,mongodb,mongoengine,Mongodb,Mongoengine,概述: 我的用户文档引用了带有文件字段的图像文档。不能使用文件字段深度复制对象(为什么不?)。深度复制用户文档会取消对关联图像(带有文件字段)的引用,因此失败 我正在尝试使用MongoEngine(0.7.8)查询集合,如果我这样查询: >>> cls.objects(Q(author=devin_user)) [<FollowUserEvent: [<User: Devin> => <User: Strike>]>]

概述:

我的用户文档引用了带有文件字段的图像文档。不能使用文件字段深度复制对象(为什么不?)。深度复制用户文档会取消对关联图像(带有文件字段)的引用,因此失败


我正在尝试使用MongoEngine(0.7.8)查询集合,如果我这样查询:

    >>> cls.objects(Q(author=devin_user))
    [<FollowUserEvent: [<User: Devin> => <User: Strike>]>]
    # Querying author works fine

    >>> cls.objects(Q(parent=strike_user))
    [<FollowUserEvent: [<User: Devin> => <User: Strike>]>]
    # Querying parent works fine

    >>> cls.objects(Q(parent=strike_user) & Q(author=devin_user))
    *** TypeError: 'Collection' object is not callable. If you meant to call the '__deepcopy__' method on a 'Collection' object it is failing because no such method exists.
    # Definitely fails here, but why?


    # Even stranger, if I combine a query on parent and hidden_at it succeeds, but if I combine a query on author and hidden_at it gloriously fails
    >>> cls.objects(Q(parent=strike_user) & Q(hidden_at=None))
    [<FollowUserEvent: [<User: Devin> => <User: Strike>]>]
    # Querying parent works fine

    >>> cls.objects(Q(author=devin_user) & Q(hidden_at=None))
    *** TypeError: 'Collection' object is not callable. If you meant to call the '__deepcopy__' method on a 'Collection' object it is failing because no such method exists.
    # Boom!
cls.objects(Q(author=devin\u user)) [ ]>] #这位作家的作品很好 >>>cls.objects(Q(父对象=strike\u用户)) [ ]>] #查询父对象很好 >>>cls.objects(Q(父对象=strike\u用户)和Q(作者=devin\u用户)) ***TypeError:“集合”对象不可调用。如果要在“Collection”对象上调用“\uuuu deepcopy\uuuuuu”方法,则失败,因为不存在此类方法。 #这里肯定失败了,但为什么呢? #更奇怪的是,如果我将对父对象和隐藏对象的查询组合在一起,它会成功,但如果我将对作者和隐藏对象的查询组合在一起,它会失败 >>>cls.objects(Q(父对象=strike\u用户)和Q(隐藏对象=None)) [ ]>] #查询父对象很好 >>>cls.objects(Q(author=devin\u user)和Q(hidden\u at=None)) ***TypeError:“集合”对象不可调用。如果要在“Collection”对象上调用“\uuuu deepcopy\uuuuuu”方法,则失败,因为不存在此类方法。 #轰! strike_user和devin_user是两个用户文档。下面是事件的样子(顺便说一下,它确实允许继承)

类事件(文档):
"""                                                            
:param anti:告知事件是否与反向事件相关
e、 g.跟随/不跟随、喜爱/不喜爱
:param partner:将反事件与事件关联。
仅在撤消事件上设置
"""                                                            
author=generireferencefield(必需=True)
父项=GenericReferenceField(必需=True)
已创建\u at=DateTimeField(必需=True,默认=datetime.now)
隐藏位置=DateTimeField()
反=布尔字段(默认值=False)
partner=ReferenceField('Event',dbref=False)
元={
“级联”:错误,
“允许_继承”:True}
定义报告(自我):
action=“=/>”如果self.anti-else“=>”
返回“%”(self.\uuuuuuuuuuuuuuuuuuuuu类\uuuuuuuuuuuuuuuuuu名称\uuuuuuuuuuuuu),
self.author.\uuuu repr\uuuu(),action,self.parent.\uuuuu repr\uuuu())
对我来说似乎是个bug,但我很有兴趣听到反馈:)


更新:

似乎mongoengine/queryset.py:98调用了copy.deepcopy。这将跟随ReferenceField,并尝试复制它的FileField数据。不幸的是,这不起作用

    Class Image(Document):
        file = FileField(required=True)

    Class User(Document):
        name = StringField()
        image = ReferenceField('Image')

    >>> copy.deepcopy(user)
    *** TypeError: 'Collection' object is not callable. If ...

    >>> user.image = None
    >>> copy.deepcopy(user)
    <User: Devin>
类图像(文档):
file=FileField(必需=True)
类用户(文档):
name=StringField()
image=ReferenceField('image')
>>>copy.deepcopy(用户)
***TypeError:“集合”对象不可调用。如果。。。
>>>user.image=None
>>>copy.deepcopy(用户)

事实证明,这是一个bug!我在概述中所说的是正确的。[缺陷的状态]

有用链接:


我真的认为这是一个bug。我已经解决了这个问题,在子类上定义了
作者
父类
作为
ReferenceField
s(dbref=True)而不是(现在是抽象的)父类的
generireferencefield
s.//现在当我查询时,我必须在子类上这样做,即使我在父类上留下了
author
parent
作为
generireferencefield
s。奇怪的是,即使我在子类的
author
parent
字段上指定了dbref=True,我也不能t查询父类:即:>>>docs.Event.objects(author=docs.Event.objects[0].author)#[]顺便说一句,关于这一点有更多的信息。
    Class Image(Document):
        file = FileField(required=True)

    Class User(Document):
        name = StringField()
        image = ReferenceField('Image')

    >>> copy.deepcopy(user)
    *** TypeError: 'Collection' object is not callable. If ...

    >>> user.image = None
    >>> copy.deepcopy(user)
    <User: Devin>