GAE Python Data Moddeling/ Querying: свойство ссылочной сущности
У меня есть сценарий, подобный этому, и я пытаюсь найти лучшее / наиболее распространенное решение:
class Car(db.Model):
peopleCapacity = db.IntegerProperty()
class Wheel(db.Model):
car = db.ReferenceProperty(reference_class=Car, collection_name='wheels')
diameter = db.IntegerProperty()
Я хочу результаты этого вида запроса:
smallWheelsForBigCars = db.GqlQuery(
'SELECT * FROM Wheel WHERE diameter < 10 AND car.peopleCapacity > 6'
)
# returns 0 entities as properties like 'car.peopleCapacity' are apparently not supported
Некоторые (хакерские) решения, которые я рассмотрел:
- Делайте ограничения для колеса и автомобиля отдельно и вручную проверяйте пересечения (медленно!)
- Сохраните копию car.peopleCapacity в Wheel с помощью computedProperty. (Плохо, так как мне нужно обновить все колеса, прикрепленные к машине, когда люди меняют емкость автомобиля. И да, в моем случае "peopleCapacity" изменится)
Мои две очереди:
Почему car.peopleCapacity не работает в запросах?
Есть ли лучшие подходы к этому?
1 ответ
Решение
Ваши выводы верны, хранилище данных не имеет возможности запроса подчиненного свойства (это можно сделать с помощью StructureProperty, но не так, как вы ищете).
Вы должны денормализовать вашу модель и поместить все в большую сущность, ее будет сложно обновить, но будет проще и быстрее получить результаты.