我有一个超过25个属性的实体。在这25个中,15个属性显示在前端表中。这些表允许对每个属性进行排序(ASC和DESC)。
要在后端处理此问题,我要检查订单类型并在ASC和DESC订单的每个属性上编写查询。为了处理15个记录排序,我有很多看起来相似的行代码。唯一不同的是订单类型。
代码如下所示:
@classmethod
def retrieve(cls, order, limit, offset):
if order == '-property_1':
results = cls.query(ancestor=parent).order(-cls.property_1).fetch(limit, offset=offset)
elif order == 'property_1':
results = cls.query(ancestor=parent).order(cls.property_1).fetch(limit, offset=offset)
.
.
.
.
elif order == '-property_15':
results = cls.query(ancestor=parent).order(-cls.property_15).fetch(limit, offset=offset)
elif order == 'property_15':
results = cls.query(ancestor=parent).order(cls.property_15).fetch(limit, offset=offset)
它为每个属性创建了2个数据存储区索引。
- kind: EntityName
ancestor: yes
properties:
- name: property_1
- kind: EntityName
ancestor: yes
properties:
- name: property_1
direction: desc
我的问题是,有没有更好的方法来处理这种情况?
答案 0 :(得分:2)
如果您传递的参数始终与您的属性名称匹配,那么您可以使用以下内容替换if语句:
desc = False
if order[0] == '-':
order = order[1:]
desc = True
query = cls.query(ancestor=parent)
order = getattr(cls, order)
if desc:
order = -order
query = query.order(order)
results = query.fetch(limit, offset=offset)
答案 1 :(得分:1)
不,您正在以正确的方式处理索引。
如果您的数据规模较小且增长相对有限,则可以切换到客户端排序,如果您想避免创建15 * 2索引。
或者,如果父项(实体组)的数量很小并且您可以使用最终一致性,则可以省略ancestor = parent子句,只需在客户端中按父级过滤即可。这将使您能够使用内置的属性索引(两个订单方向),而不需要复合索引。