Как извлечь данные из двух классов 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 2

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 .