Mongoengine 连续使用 filter() 和 ReferenceField() 导致 "TypeError: 'Collection' object is not callable

1 投票
1 回答
1300 浏览
提问于 2025-04-17 16:02

有两个MongoEngine文档:

class A(Document):
    a = StringField()

class B(Document):
    b = StringField()
    boolfield = BooleanField(default=False)
    ref = ReferenceField(A)

我想先对一个特定的A对象进行filter()操作,然后再从第一次查询的结果中,对布尔字段进行filter()操作。但是这些代码行导致了一个错误:

a_objects = A.objects(a='test') # OK
query = B.objects(ref__in=a_objects) # OK
query2 = query.filter(boolfield=True) # FAILS

错误信息是:

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.

完整的代码和错误追踪信息可以在这里查看:https://gist.github.com/nferrari/4962245

谢谢!

1 个回答

1

看起来在0.7.8版本中,查询引用字段不能连着用,所以目前请使用字典,然后作为关键字参数传入,这样可以解决这个问题,比如:

    a_objects = A.objects(a='test')
    query_dict = {'ref__in': a_objects}
    query_dict['boolfield'] = True
    self.assertEquals(B.objects(**query_dict).count(), 1)

我已经添加了这个问题:https://github.com/MongoEngine/mongoengine/issues/234,希望在0.8版本中修复。

撰写回答