Расчесывание PolyModel с NDB

Я пытаюсь объединить класс полимодели с классом NBD. Любая помощь в разъяснении "лучшего" способа сделать это была бы полезна, учитывая следующую проблему.

У меня есть полимодель фруктов (Fruit -> Tree-Bearing -> Apples -> Granny Smith - в качестве примера иерархии полимоделей) я хочу сохранить его в модели ndb.Model, которая называется Diet. Очевидно, у меня есть категория для фруктов, категория для овощей и т. Д. Как это должно быть построено?

пока что у меня есть:

class Diet(ndb.Model):
    nameOfDiet = ndb.StringProperty()
    fruit = ndb.StructuredProperty(Fruit)
    vegetable = ndb.StructuredProperty(Vegetable)

Проблема с этим - как мне кажется, я правильно читаю, заключается в том, что фрукты и овощи в рационе "не подлежат сомнению". Я, очевидно, хочу, чтобы пользователи могли искать диеты, которые соответствуют их конкретным фруктам. Я также хочу воспользоваться возможностями кэширования ndb. Как я могу эффективно запросить фрукты, чтобы, если мне нужны все диеты для бабушки Смит, я мог получить их, не возвращая ни одного из них, у которых нет значения "нет". Плюс, можно ли вообще сделать поли-модель с NDB? Если нет, то как бы я изменил структуру фруктов, чтобы А) соответствовал тому, что я хочу, и Б) был бы хотя бы номинально эффективен?

Спасибо! Джон

1 ответ

Я не думаю, что вам нужно использовать полимодель в этом случае. Вы можете использовать свойство list для fruit, которое содержит иерархию фруктов.

class Diet(ndb.Model):
    name = ndb.StringProperty()
    fruit = ndb.StringProperty(repeated=True)
    vegetable = ndb.StringProperty(repeated=True)

Свойство плода может содержать ["Подшипник дерева", "Яблоки", "Бабушка Смит", "Подшипник дерева", "Яблоки", "Золотой вкусный", "Подшипник дерева", "Апельсины"]]. Тогда, если вы хотите найти диеты с "Яблоками", вы можете сделать следующее:

results = Diet.query(Diet.fruit == 'Apples').fetch(20)

Или, если вы хотите найти диету, которая содержит "Яблоки" и "Апельсины", вы можете использовать запрос IN.

results = Diet.query(Diet.fruit.IN(['Apples', 'Oranges'])

Если вам требуется более подробная информация о каждом из фруктов, например: содержание сахара, сезон и т. Д., Вы можете создать модель для фруктов, где имя_ключа - это имя фрукта (чтобы можно было быстро получить данные о фруктах). фрукты). Фруктовая модель может содержать иерархию родителей в случае необходимости.

class Fruit(ndb.Model):
    name = ndb.StringProperty()
    sugar_content = ndb.FloatProperty()

Таким образом, чтобы получить подробную информацию о "Golden Delicious", вы должны создать ключ и получить данные. Выборка данных может быть выполнена асинхронно с использованием функции Map. Получение по ключу также кэширует данные для вас, поэтому последующие операции получают прямо из memcache.

gd =ndb.Key("Fruit", "Golden Delicious").get()

Другой вариант: сохранить объекты Fruit как структурированное свойство (как вы это сделали в настоящее время), но повторить структурированное свойство.

class Diet(ndb.Model):
    name = ndb.StringProperty()
    fruit = ndb.StructuredProperty(Fruit, repeated=True)

Запросы могут быть выполнены аналогичным образом для структурированного свойства в вашей модели диеты:

results = Diet.query(Diet.fruit.name == 'Orange')

Наконец, полимодели возможны с помощью ndb, см. https://developers.google.com/appengine/docs/python/ndb/polymodelclass

Для получения дополнительной информации о асинхронном получении данных см. https://developers.google.com/appengine/docs/python/ndb/async

Другие вопросы по тегам