1

次の方法で、メタという名前のタグを持つ投稿を選択から除外しようとしています:

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)

しかし、それらの投稿は引き続き私の選択に表示されます。

その式をどのように書くのが正しいですか?

私のテーブルは次のようになります。

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())
)

Python 2.7.2 の High Replication DataStore を使用して、GAE で Web2Py 1.99.7 を使用しています。

アップデート:

posts=db(not_meta).select()@Anthony の提案に従って試してみましたが、次のトレースバックを含むチケットが表示されます。

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

更新 2:

~現在Datastore を使用した GAE に取り組んでいないため、一時的な回避策として次の方法を使用しています。

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
4

1 に答える 1

1

試す:

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

まず、最初のクエリは完全な Row オブジェクトを返すため、「id」フィールドだけを取り出す必要があります。2 つ目not_metaは Query オブジェクトであるため、内部db(not_meta)に移動して、選択するレコードのセットを定義する Set オブジェクトを作成します (このselect()メソッドは、レコードごとに返すフィールドのリストと、 、 などの他のいくつかの引数を取りorderbyますgroupby) .)。

于 2012-04-12T04:59:56.640 に答える