Дублированные идентификаторы, возвращенные из конечной точки облака Python Appengine

Я написал очень простое приложение на движке приложения, используя библиотеку endpoints-proto-datastore. У меня проблемы с моим методом списка. Мне нужно запросить данные у клиента javascript и иметь возможность обновлять любую конкретную сущность на основе пользовательского ввода. Конечная точка возвращает массив объектов, как и ожидалось, но иногда есть два объекта, которые имеют один и тот же идентификатор. Это делает невозможным надежное обновление объекта в хранилище данных, так как я не могу сказать, к какому из них фактически принадлежит идентификатор.

Вот скриншот из инструмента просмотра хранилища данных:скриншот

и результат вызова метода списка через проводник API:

200 OK
<headers omitted>
{
 "items": [
  {
   "id": 5906470911296406000,
   "prices": [
    "$1000.00"
   ],
   "options": [
    "Chrome"
   ],
   "title": "New Equipment",
   "quantity": true
  },
  {
   "id": 5906470911296406000,
   "title": "New Equipment",
   "quantity": false
  }
 ]
}

Вы можете видеть, что идентификаторы дублируются в проводнике API, но не в хранилище данных. До сих пор мне не удавалось достоверно воспроизвести это поведение, но, похоже, это происходит только тогда, когда я добавляю в хранилище данных две сущности, которые очень похожи, как и выше.

Моя модель:

class AvailableEquipment(EndpointsModel):
    _message_fields_schema = ('id', 'title', 'options', 'prices', 'quantity')
    title = ndb.StringProperty()
    options = ndb.StringProperty(repeated=True)
    prices  = ndb.StringProperty(repeated=True)
    quantity = ndb.BooleanProperty()

Мой API:

@endpoints.api(name='equipment', version='v1', description='API for available equipment data')
class AvailableEquipmentAPI(remote.Service):

    @AvailableEquipment.method(path='equipment', http_method='POST', name='insert')
    def EquipmentInsert(self, equipment):
        equipment.put()
        return equipment

    @AvailableEquipment.query_method(path='equipment', name='list')
    def EquipmentList(self, query):
        return query

Все эти тесты были проведены на локальном сервере разработки. Спасибо за любую помощь, которую вы можете оказать.

2 ответа

Решение

Это связано с тем, что Javascripts хранит числа, используя 64-битные числа с плавающей точкой.

Они уже изменили это, и фактически в версии 1.8.0 они исправили это, и автоматический ID меньше, поэтому они могут быть представлены в JSON. В последнем сообщении в блоге они объявили, что в следующей версии это будет гарантировано, и разбросанные автоматические идентификаторы будут по умолчанию.

Вы используете самый последний SDK? В предыдущей версии генерировались идентификаторы, которые были слишком велики для хранения с плавающей точкой javascript, поэтому два уникальных идентификатора могли округлять / усекать до одинакового значения. То, что ваши идентификаторы заканчиваются на 000, указывают на то, что это может быть причиной. Последняя версия и живая среда не страдают от этой проблемы.

Другие вопросы по тегам