2013-02-15 3 views
1

2 Le fait que ces documents MongoEngine:Mongoengine filtre enchaînant() et ReferenceField() provoque "TypeError: objet 'Collection' est pas appelable"

class A(Document): 
    a = StringField() 

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

Je voudrais d'abord filter() sur un objet spécifique, puis, à partir de la première requête, filter() sur le BooleanField. Mais ces lignes provoquent une erreur:

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

L'erreur est:

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. 

Voir le code complet et retraçage ici: https://gist.github.com/nferrari/4962245

Merci!

+0

Quelle version de Mongoengine et pymongo? – Ross

+0

mongoengine 0.7.8, pymongo 2.4.2 –

Répondre

1

Il semble que l'interrogation des champs de référence ne peuvent être enchaînées en 0.7.8 - donc pour l'instant s'il vous plaît utiliser un dictionnaire, puis passe en tant que kwargs comme par exemple le travail autour:

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

J'ai ajouté : https://github.com/MongoEngine/mongoengine/issues/234 être fixé dans 0.8

+0

Merci pour la réponse. En effet, le problème est résolu en utilisant un dict et en passant kwargs. –

Questions connexes