Эмуляция условия «ИЛИ» в Datastore - PullRequest
2 голосов
/ 14 мая 2010

Я использую Google App Engine с Python (Django). Как эмулировать "SELECT * FROM bla WHERE touser = common.userstats("key") OR fromuser = common.userstats("key") ORDER BY date ASC"?

Я думал о чем-то подобном, но я не могу получить это в том порядке, как хочу.

    recievedlist = models.P1.all()
    recievedlist.filter("touser =", common.userstats("key"))
    plus1list = recievedlist.fetch(50)

    sendlist = models.P1.all()
    sendlist.filter("fromuser =", common.userstats("key"))
    plus1list += sendlist.fetch(50)

    # order plus1list

1 Ответ

2 голосов
/ 14 мая 2010

Вы можете добавить ListProperty к вашей модели, которая содержит touser и fromuser. Затем вы можете выполнить один запрос для извлечения интересующих вас объектов, отсортированных по дате. Это исключает запрос к хранилищу данных и сортировку в памяти, но стоит вам дополнительный индекс и немного больше места для хранения в вашей модели.

(псевдо) Пример:

class bla(db.Model):
    ...
    toandfromuser = db.ListProperty(...)

Затем вы можете выполнить запрос, подобный этому (поскольку объект будет соответствовать, если ЛЮБОЙ элемент списка toandfromuser соответствует искомому значению):

SELECT * FROM bla WHERE toandfromuser = common.userstats("key") ORDER BY date ASC
...