子实体的值在它们应该是整数时被转换为字符串。无法添加过滤器和查询

问题描述 投票:0回答:0

所以说我创建了一个实体

def create_entity_from_key(kind: str, value) -> datastore.Entity:
        return datastore.Entity(key=datastore_client.key(kind, value))

def create_driver_entity(entity: datastore.Entity, name: str, 
        stat_totals: dict, team: str) -> datastore.Entity:
        entity.update({
            'name': name,
            'stat_totals': stat_totals,
            'team': team 
        })
        return entity

def create_driver_stats(age:int, pole_positions: int, race_wins: int, points_scored: int, world_titles: int, fastest_laps: int) -> dict:
        driver_stats = {
            'age': int(age),
            'pole_positions': int(pole_positions),
            'race_wins': int(race_wins),
            'points_scored': int(points_scored),
            'world_titles': int(world_titles),
            'fastest_laps': int(fastest_laps)
        }
        return driver_stats

#get the values
        name = request.form['name-tf']
        age = request.form['age-tf']
        #get rest of the values in the same way

#create the entity
        entity = create_entity_from_key('driver', name)
        #create the stats
        stats = create_driver_stats(age, plpos, rcwin, ptscr, wdttl, fstlp)
        #create the entity
        create_driver_entity(entity, name, stats, rctem)

        #put the entity into datastore
        datastore_client.put(entity)

当我尝试使用过滤器获取实体时,我得到了错误的实体。即下面的代码没有按预期工作

attr = request.form['attr']
    value = request.form['value']
    #check if value is digit if it is, convert
    if value.isdigit():
        value = int(value) 
    query = datastore_client.query(kind=kind_type)
    #attr would be 'stat_totals.age' for example. I have confirmed that the correct string is being used 
    query.add_filter(attr, ">=", str(value))
    result = query.fetch()
    return result

当我检查数据存储时,这就是我发现的

{
  "properties": {
    "race_wins": {
      "integerValue": "9"
    },
    "pole_positions": {
      "integerValue": "9"
    },
    "points_scored": {
      "integerValue": "9"
    },
    "world_titles": {
      "integerValue": "9"
    },
    "age": {
      "integerValue": "9"
    },
    "fastest_laps": {
      "integerValue": "9"
    }
  }
}

我不太确定出了什么问题。我认为这是因为数字周围的引号。所以我尝试删除它们,但是一旦我保存了实体,引号又回来了。 我只需要能够为数值添加过滤器并获得预期的结果。

我试过对 str 和 int 进行类型转换。

如果我使用

query.add_filter(stat_totals.age, ">=", 9)
行,我希望只获得年龄 > 9 的实体。相反,我得到更多,我认为这是因为过滤器正在比较字符串。

python filter nosql google-cloud-datastore datastore
© www.soinside.com 2019 - 2024. All rights reserved.