在汽车历史的应用程序中,我必须创建不同的图表,其中某些模型可能出现在一个或多个不同的图表中,如#34;最快的汽车","最好的汽车"等等然后他们必须在图表中订购。我使用StructuredProperty来创建标签名称/订单位置对。
class CarTag(ndb.Model):
name = ndb.StringProperty()
position = ndb.IntegerProperty()
class Car(ndb.Model):
model_name = ndb.StringProperty()
trim = ndb.StringProperty()
year = ndb.IntegerProperty()
tags = ndb.StructuredProperty(CarTag, repeated=True)
结构化属性上的过滤器工作正常。
cars = Car.query(Car.tags.name=="fastest car")
但要获得有序图表,我需要通过相同StructuredProperty的position属性对它们进行排序,其名称为"最快的汽车"。当我读入this question时,订单(Car.tags.position)将仅按列表的第一个元素排序。
cars = Car.query(Car.tags.name==name).order(Car.tags.position)
是否可以按特定StructuredProperty的属性订购?
答案 0 :(得分:2)
并非您无法通过StructuredProperty中的属性进行排序,而是重复您的StructuredProperty = True ...使其成为列表属性..并且您无法对list-property进行可靠的排序:
具有多个值的属性可能会以令人惊讶的方式运行
由于它们被编入索引的方式,具有多个值的实体 相同的属性有时可以与查询过滤器和排序进行交互 以意想不到的惊人方式下订单。
.....
如果查询结果按升序排序,则为最小值 该物业用于订购。如果结果排序在 降序,最大值用于排序。其他 值不会影响排序顺序,也不会影响值的数量。 这具有不寻常的后果,即具有属性值1的实体 并且9在一个值为4,5,6和7之间,在升序和升序中 降序。