2011-01-28 3 views
0

Это продолжение моих previous question.Как фильтровать() для разных предметов?

Я использую ту же самую модель

class Item(db.Model): 
    ... 
    glam = db.StringProperty() 
    casual = db.StringProperty() 
    speaking = db.StringProperty() 

и предположу, что у меня есть 2 пунктов и 1 помечен «глэй» другие помеченные «говорящий».

Если я отфильтровывать как этот

query.filter("glam", "glam") 
    query.filter("speaking"), "speaking") 

фильтр не возвращает ни, потому что это выглядит для 1 пункт с тегом «глэм» и «говорить».

Как отфильтровать отдельные элементы?

Update

Item таблица может выглядеть следующим образом:

  glam speaking 
     ------------------- 
item1 
item2 glam 
item3   speaking 
item4 
item5 glam 

Я хотел бы, чтобы отфильтровать "глэм" и "говорить"

ответ

1

С вашей текущей схемы и текущий хранилищу API, вы не можете добиться этого с помощью одного запроса.

Если «глэм», «случайно» и «говорить» являются взаимоисключающими, вы можете использовать IN запрос на одном поле:

class Item(db.Model): 
    ... 
    tag = db.StringProperty() 

query.filter("tag IN", ["glam", "speaking"]) 

Вы можете также использовать экспериментальную Datastore Plus API и сделать OR запрос (который реализуется путем объединения результатов двух запросов внутренне):

# Note: Your model must be a Datastore Plus model; this may require some restructuring! 
q1 = query.filter("glam =", "glam") 
q2 = query.filter("speaking =", "speaking") 
for result in q1.OR(q2): 
    .... 

Обратите внимание, что хранилище данных и API все еще находится в разработке, поэтому я не уверен, что если эти запросы выполняются параллельно еще, но они должны быть в конце концов. Кроме того, поскольку API Datastore Plus все еще экспериментальный и разрабатываемый, вам, возможно, придется изменить свой код в ответ на поток API. По крайней мере, вы можете контролировать, когда эти обновления происходят.

+0

Спасибо за ответ. На данный момент я не хочу использовать экспериментальный API Datastore Plus. Затем, каков наилучший способ обработать «привязку изображений» в хранилище данных? Должен ли я изменить свою схему и использовать отношения «один ко многим»? – Zeynel

+2

Вы можете использовать StringListProperty (http://code.google.com/appengine/docs/python/datastore/datamodeling.html#Lists). Затем вы можете выполнить запрос AND, просто используя несколько фильтров равенства в одном и том же свойстве. – bdonlan

+0

Я попробовал StringListProperty, но заметил, что если я использую несколько фильтров для «glam» и «casual»; элемент с тегами ["glam", "casual"] будет возвращен, но другой элемент с тегом [glam] не будет возвращен. – Zeynel

Смежные вопросы