Как сделать что-то вроде SQL JOIN с appengine - PullRequest
1 голос
/ 13 февраля 2012

Мне нужно что-то в точности как SQL JOIN, что невозможно сделать с помощью appengine, поэтому я ищу обходной путь.Это запрос, который нужно отсортировать по person.lastname

downline = User.query(User.sponsor == distributor.key).fetch()
for person in downline
    orders = model.Order.all().filter('distributor_id =' , person.key.id()).filter('created >' , startdate).filter('status =', 'PAID').fetch(999999)

Запрос извлекает заказы, размещенные человеком, и в основном у меня есть 2 вида сущностей, людей и заказов.Как мне подражать тому, что я присоединяюсь к сущности лиц (пользователей) и сортирую список по фамилии человека?Это очень легко сделать в SQL, и я не смог найти способ сделать это в appengine.

Можете ли вы сказать мне, как я могу добавить имена людей в память?Функция не должна иметь очень хорошую производительность, так как это функция отчетности.

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

Вы можете связать свои модели Person и Order с помощью родительских функций - Person является родительским объектом Order.При этом становится просто перебирать набор Person в порядке и выбирать его порядки.

Другой способ - использовать ListPoperty, если вы используете текущий API или повторяющиеся свойства, если вы используете NDB для связи вашегоЗаказ для вашего лица.

1 голос
/ 13 февраля 2012

Не используйте идентификаторы для связи моделей. Это подход SQL; вам нужно принять подход noSQL.

Вместо неявного связывания Order с User с общим идентификатором, просто укажите User в Order.

class User(db.Model):
    # ...

class Order(db.Model):
    distributor = db.ReferenceProperty(User)
    # ...

# e.g.,
order = Order()
order.distributor = User()

Затем захватите ваших пользователей, отсортировав их по order(), а затем соберите все связанные Order s, используя filter() против соответствующих User.

distributors = User.all().filter('sponser = ', sponser).order('lastname').fetch(i)
for distributor in distributors:
    orders = Order.all().filter('distributor', distributor).fetch(j)
    # ...
0 голосов
/ 13 февраля 2012

Если вы действительно не заботитесь о производительности, и это касается единовременной работы с отчетами, возможно, вы захотите посмотреть с помощью remote-api.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...