NDB按重复StructuredProperty的特定实例的属性排序

时间:2015-04-20 22:59:53

标签: python google-app-engine google-cloud-datastore app-engine-ndb

在汽车历史的应用程序中,我必须创建不同的图表,其中某些模型可能出现在一个或多个不同的图表中,如#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的属性订购?

1 个答案:

答案 0 :(得分:2)

并非您无法通过StructuredProperty中的属性进行排序,而是重复您的StructuredProperty = True ...使其成为列表属性..并且您无法对list-property进行可靠的排序:

https://cloud.google.com/appengine/docs/python/datastore/queries#properties_with_multiple_values_can_behave_in_surprising_ways

  

具有多个值的属性可能会以令人惊讶的方式运行

     

由于它们被编入索引的方式,具有多个值的实体   相同的属性有时可以与查询过滤器和排序进行交互   以意想不到的惊人方式下订单。

     

.....

     

如果查询结果按升序排序,则为最小值   该物业用于订购。如果结果排序在   降序,最大值用于排序。其他   值不会影响排序顺序,也不会影响值的数量。   这具有不寻常的后果,即具有属性值1的实体   并且9在一个值为4,5,6和7之间,在升序和升序中   降序。