2017-09-26 1 views
0

Je souhaite créer dynamiquement des clauses where dans peewee. J'ai appris que j'ai besoin d'utiliser des expressions, mais je ne peux pas faire fonctionner ça. Voici mon code:L'extension des expressions peewee renvoie l'objet 'Expression' n'est pas itérable

clauses = [ 
    (Docs.language_frst == 0), 
    (Docs.body_len <= max_body_len), 
    (Docs.body_len >= min_body_len) 
    ] 

    if len(aValid_ids_used): 
    clauses.extend((Docs.id.not_in(aValid_ids_used))) 

    docids = Docs.select(Docs.id).where(reduce(operator.and_, clauses)) 

Tant que aValid_ids_used est vide le code fonctionne très bien. Une fois aValid_ids_used ne vide plus et je demande aux clauses d'être étendue, je reçois une erreur:

Traceback (most recent call last): File "xyz.py", line 170, in <module> 
clauses.extend((Docs.id.not_in(aValid_ids_used))) 
TypeError: 'Expression' object is not iterable 

Répondre

1

Vous devez passer une liste de prolonger avec. Vous passer actuellement un Expression

clauses.extend((Docs.id.not_in(aValid_ids_used),)) 

par exemple

>>> c = [] 
>>> c.extend((2)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not iterable 
>>> c.extend((2,)) 
>>> c 
[2] 
1

Vous voulez probablement utiliser list.append plutôt que list.extend. extend prend une liste comme argument, alors que append prend un seul article.