GQL не распознает ReferenceProperty в фильтре - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть хранилище данных, в котором ~ 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)

1 Ответ

1 голос
/ 30 сентября 2011

Наиболее вероятным объяснением является то, что при вставке данных свойство ссылки было установлено как indexed=False.Изменения в модели влияют только на объекты, записанные после изменения модели, поэтому строки, вставленные в то время, когда индексирование было отключено для этого столбца, не будут иметь строк индекса.

...