У меня есть хранилище данных, в котором ~ 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
Я могу использовать администратора хранилища данных для просмотра определенного элемента (т. Е. Где 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-библиотеку), который открывает CSV-файл, хранящийся в BLOB-хранилище. Для всех намерений и целей это просто анализ файла 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)