如何按可为空的重复字段排序ndb查询

2024-04-27 00:14:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个具有重复属性的ndb模型:

class MyModel(ndb.Model):

  foo = ndb.KeyProperty(repeated=True)

我想对foo进行不等式过滤,这意味着我需要按foo排序:

^{pr2}$

我希望查询包含foo为空的实体。如果我在foo中放入一个虚拟字段,它会起作用:

def _pre_put_hook(self):
  if not self.foo:
    self.foo.append(ndb.Key('Dummy Kind', 'Dummy ID'))

但这似乎不是一个干净的方法。有更好的方法吗?在


Tags: 方法模型selftruemodel属性foo排序
1条回答
网友
1楼 · 发布于 2024-04-27 00:14:07

当数据存储在索引中存储带有repeated=True的属性时,它stores one row for each value。这意味着,如果您有一个空的重复属性,它将不会显示在您的EntitiesByProperty索引中。这意味着不可能查询空的重复属性。在

有几种选择,但它们各有利弊:

添加虚拟值

您建议的这种方法的好处是现有查询将提供所需的结果。但是,在添加实际数据时,必须处理清除伪键的问题。在

使用ComputedProperty

您可以为foo属性的大小添加一个新属性:

class MyModel(ndb.Model):
  foo = ndb.KeyProperty(repeated=True)
  foo_len = ndb.ComputedProperty(lambda self: len(self.foo))

但是,要获得foo值与my_key不匹配或为空的实体,必须编写两个查询来获取结果:

^{pr2}$

请注意,如果foo没有重复,则进行以下查询将得到所需的结果:

ndb.gql("SELECT * FROM MyModel WHERE foo != :1", my_key)

即使没有空列表大小写,在使用重复属性时也需要小心。特别是,只有一个重复的属性必须与您的键匹配。因此,下面定义的模型仍将匹配您的查询,因为my_key2 != my_key

MyModel(foo=[my_key, my_key2])

相关问题 更多 >