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>