GQL无法识别过滤器中的ReferenceProperty

时间:2011-09-28 15:26:19

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

我有一个拥有~850组和~19,000项的数据存储区。每个项目可能只属于一个组,我的应用程序中有两个模型代表一个组和一个项目:

class Group(db.Model):
    Id = db.IntegerProperty()
    Name = db.StringProperty()
    # ... some other  properties

class Item(db.Model):
    Id = db.IntegerProperty()
    Name = db.StringProperty()
    Group = db.ReferenceProperty(Group, collection_name="groupItems")
    # ... some other properties

我可以使用数据存储区管理员查看特定项目(即WHERE Id = 34)并查看它是否正确连接到组 -

SELECT * FROM Item WHERE Id = 34

这给了我一个具有以下属性的组:

Decoded entity key: Group: id=10321
Entity key: agtzfmV2ZS1taW5lcnIMCxIFR3JvdXAY0VAM
Id: 18

如果我改变我的GQL查询以检索该组的所有项目,我将得不到任何结果! -

SELECT * FROM Item WHERE Group = KEY('agtzfmV2ZS1taW5lcnIMCxIFR3JvdXAY0VAM') -- No Results
SELECT * FROM Item WHERE Group = KEY('Group', 'agtzfmV2ZS1taW5lcnIMCxIFR3JvdXAY0VAM') -- No Results

如果我只检索该组,则按预期工作 -

SELECT * FROM Group WHERE __key__ = KEY('agtzfmV2ZS1taW5lcnIMCxIFR3JvdXAY0VAM')  -- Returns 1 Group

这同样适用于我的Python代码。主叫:

group = Group.gql("WHERE Id = :1", 18).get()
items = Item.gql("WHERE Group = :1", group).fetch(50)

会产生一个不包含任何项目的列表。类似地

group.groupItems.fetch(500) -- Returns no results

我的问题是 - 我做的事情特别愚蠢吗?我已经创建了一个具有类似结构的虚拟项目,以向我自己证明它不是一个命名问题(即该组不是一个保留字)并且返回正常。 (如果有人有兴趣,请附上。)

我做错了什么?

编辑1:

根据要求,这是创建代码。 Reader是一个csv阅读器(使用内置的csv库),它打开存储在BLOB存储中的CSV。对于所有意图和目的,它仅仅解析CSV文件。正如刚才提到的。在数据查看器中,通过我的仪表板,我的项目正确绑定到一个组(一个组列在项目旁边,我可以点击它的链接查看该组)但是当将组作为过滤器的一部分传递给项目时没有结果被退回 -

小组 -

reader = UploaderBase().open_from_blobstore(Settings().get_group_csv_key())
upNum = 0
groupsToPut = []
for row in reader:
    group = Group(Id=int(row[0]))
    group.Name = row[2]
    groupsToPut.append(group)

db.put(groupsToPut)

项目 -

groupCache = {}
for group in Group.all().fetch(1000):
    groupCache[group.Id] = group
logging.info("Cached %d group entries locally" % len(groupCache))

items = []
reader = UploaderBase().open_from_blobstore(Settings().get_items_csv_key())
upNum = 0
for row in reader:
    logging.debug("Adding row %d" % upNum)
    item = Item(Id=int(row[0]))

    if not row[1] is None and  row[1] != "":
        item.Group = groupCache[int(row[1])]

    item.Name = row[2]
    items.append(item)

db.put(items)

1 个答案:

答案 0 :(得分:1)

最可能的解释是,当您插入数据时,引用属性设置为indexed=False。对模型的更改仅影响在模型更改后写入的实体,因此在为该列禁用索引时插入的行将不具有索引行。