2012-04-12 6 views
1

Ich versuche Beiträge auszuschließen, die einen Tag mit dem Namen Meta aus meiner Auswahl haben, von:Abfrage oder Ausdruck für den Ausschluss bestimmter Werte von DAL Auswahl

meta_id = db(db.tags.name == "meta").select().first().id 
not_meta = ~db.posts.tags.contains(meta_id) 
posts=db(db.posts).select(not_meta) 

Aber diese Beiträge in meiner Auswahl zeigen noch.

Was ist der richtige Weg, um diesen Ausdruck zu schreiben?

Meine Tabellen wie folgt aussehen:

db.define_table('tags', 
    db.Field('name', 'string'), 
    db.Field('desc', 'text', default="") 
) 

db.define_table('posts', 
    db.Field('title', 'string'), 
    db.Field('message', 'text'), 
    db.Field('tags', 'list:reference tags'), 
    db.Field('time', 'datetime', default=datetime.utcnow()) 
) 

Ich web2py 1.99.7 auf GAE mit High Replication Datastore auf Python 2.7.2

UPDATE:

Ich habe gerade versucht posts=db(not_meta).select() wie von @ Anthony vorgeschlagen, aber es gibt mir ein Ticket mit der folgenden Rückverfolgung:

Traceback (most recent call last): 
    File "E:\Programming\Python\web2py\gluon\restricted.py", line 205, in restricted 
    exec ccode in environment 
    File "E:/Programming/Python/web2py/applications/vote_up/controllers/default.py", line 391, in <module> 
    File "E:\Programming\Python\web2py\gluon\globals.py", line 173, in <lambda> 
    self._caller = lambda f: f() 
    File "E:/Programming/Python/web2py/applications/vote_up/controllers/default.py", line 8, in index 
    posts=db(not_meta).select()#orderby=settings.sel.posts, limitby=(0, settings.delta) 
    File "E:\Programming\Python\web2py\gluon\dal.py", line 7578, in select 
    return adapter.select(self.query,fields,attributes) 
    File "E:\Programming\Python\web2py\gluon\dal.py", line 3752, in select 
    (items, tablename, fields) = self.select_raw(query,fields,attributes) 
    File "E:\Programming\Python\web2py\gluon\dal.py", line 3709, in select_raw 
    filters = self.expand(query) 
    File "E:\Programming\Python\web2py\gluon\dal.py", line 3589, in expand 
    return expression.op(expression.first) 
    File "E:\Programming\Python\web2py\gluon\dal.py", line 3678, in NOT 
    raise SyntaxError, "Not suported %s" % first.op.__name__ 
SyntaxError: Not suported CONTAINS 

UPDATE 2:

Wie ~ arbeiten derzeit nicht auf GAE mit Datastor, ich folgende als vorübergehende Behelfslösung bin mit:

meta = db.posts.tags.contains(settings.meta_id) 
all=db(db.posts).select()#, limitby=(0, settings.delta) 
meta=db(meta).select() 
posts = [] 
i = 0 
for post in all: 
    if i==settings.delta: break 
    if post in meta: continue 
    else: 
     posts.append(post) 
     i += 1 
#settings.delta is an long integer to be used with limitby 

Antwort

1

Versuchen:

meta_id = db(db.tags.name == "meta").select().first().id 
not_meta = ~db.posts.tags.contains(meta_id) 
posts = db(not_meta).select() 

Zunächst gibt Ihre erste Abfrage ein vollständiges Row-Objekt zurück, daher müssen Sie nur das Feld "id" auswählen. Zweitens ist not_meta ein Query-Objekt, so dass es in db(not_meta) geht, um ein Set-Objekt zu erstellen, das den Datensatzsatz definiert (die select()-Methode nimmt eine Liste der für jeden Datensatz zurückzugebenden Felder sowie einige andere Argumente wie z orderby, groupby usw.).

+0

Tut mir wirklich leid @Anthony, ich vermisste '.id' in meiner Frage, obwohl ich es in meinem Code verwende. – Sathvik

+0

Ich habe gerade 'db (not_meta) .select()' versucht, aber es gibt mir eine Fehlermeldung mit dem Hinweis ' Nicht unterstützt CONTAINS ' – Sathvik

+0

* Ich habe die Frage mit der Traceback aktualisiert – Sathvik

Verwandte Themen