Как извлечь данные из двух классов GQL? - PullRequest
2 голосов
/ 27 апреля 2011

У меня есть следующие 2 класса:

class UsersRSS(db.Model):
    userId = db.IntegerProperty()
    fileHash = db.StringProperty()
    added = db.DateTimeProperty(auto_now_add=True)

class Files(db.Model):
    fileHash = db.StringProperty()
    title = db.StringProperty()
    file = db.BlobProperty()
    added = db.DateTimeProperty(auto_now_add=True)    

Мне нужно создать запрос GQL, который будет возвращать данные из обеих таблиц:

items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id)

Но каждый itemкроме полей fileHash и added, должны содержать поля из второго класса - title и file (сопоставление должно быть выполнено полем fileHash).

1 Ответ

4 голосов
/ 27 апреля 2011

Невозможно извлечь из Datastore разные виды, используя один и тот же оператор GQL Select .

Другим вариантом будет использование ReferenceProperty для создания отношения многие-к-одному между UsersRSS и Files, рефакторинг вашего кода следующим образом:

class UsersRSS(db.Model):
    userId = db.IntegerProperty()
    file = db.ReferenceProperty(Files)
    added = db.DateTimeProperty(auto_now_add=True)

class Files(db.Model):
    fileHash = db.StringProperty()
    title = db.StringProperty()
    file = db.BlobProperty()
    added = db.DateTimeProperty(auto_now_add=True)

items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id)

Таким образом, свойства Files будут автоматически разыменовываться с использованием точечной нотации item.file.title:

for item in items:
    print item.UserID
    print item.Added
    print item.file.title #This costs an additional RPC call to Datastore

Чтобы сохранить приложение от RPC-ссылки ReferenceProperty, загляните в вечнозеленую статью Предварительная выборка ReferenceProperty .

...