GQL с двумя таблицами - PullRequest
       19

GQL с двумя таблицами

0 голосов
/ 05 января 2010

Здравствуйте, я делаю очень маленькое приложение в Google Appengine, и я использую Python. Моя проблема заключается в том, что у меня есть две таблицы, использующие de db.model («клиенты» и «запросы»). В таблице «клиент» есть поля электронной почты и имени, а в таблице «запросы» - поля электронной почты и вопроса. Я хочу сделать запрос, который возвращает для каждого запроса адрес электронной почты, вопрос и имя клиента, если адрес электронной почты совпадает в двух таблицах. Кто-нибудь может помочь, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 05 января 2010

Хранилище данных движка приложения не поддерживает объединения, поэтому вы не сможете решить эту проблему с помощью GQL. Вы можете использовать два метода get, один для клиента и один для запроса, или вы можете использовать ReferenceProperty для установления отношений между двумя объектами.

Если вам нужно смоделировать отношение один ко многим, вы можете сделать это с помощью ссылочного свойства. Для вашего случая это будет выглядеть примерно так:

class Client(db.Model):
    email = db.UserProperty()
    name = db.StringProperty()

class Request(db.Model):
    client = db.ReferencePrpoerty(Client, collection_name='requests')
    issue = db.StringProperty()

Любой объект Client, с которым связан запрос, автоматически получит свойство с именем запросы , которое будет объектом Query, который будет возвращать все объекты запроса, для которых поле client установлено в конкретный клиентский объект, с которым вы имеете дело.

Возможно, вы также захотите убедиться, что код, который создает объекты запроса, устанавливает для каждого нового объекта объект-клиент для конкретного пользователя в качестве его предка. Хранение этих связанных элементов в одной и той же группе объектов может быть полезным по причинам производительности и транзакций.

0 голосов
/ 13 января 2010

с использованием этих моделей:

class Client(db.Model):
    email = db.StringProperty()
    name = db.StringProperty()

class Request(db.Model):
    client = db.ReferenceProperty(Client, collection_name='requests')
    issue = db.StringProperty()    

С помощью этого кода можно запросить данные

from modelos import Client,Request

ctes=Client.all().filter("email =","somemail@mailbox.com.mx")

for ct in ctes:
   allRequest4ThisUser=Request.all().filter("client =",ct)
   for req in allRequest4ThisUser:
     print req.issue
...