Как извлечь данные из двух классов GQL?
У меня есть следующие 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 ответ:
Нет способа получить из хранилища данных различные типы, используя один и тот же оператор 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, посмотрите на evergreen article ReferenceProperty prefetching .