GAE启动器中的数据库ID号非常大?

时间:2013-04-02 13:40:56

标签: javascript django google-app-engine google-cloud-datastore django-serializer

我从GAE Launcher的las更新开始,它在数据存储上创建的ID太大了。像5330010158992982016,这对我来说是一个问题,因为在Javascript上这些数字是四舍五入的。

例如,在JS

> a = 533001015899298254645
> 533001015899298270000

阅读JSON,如[{“pk”:5330010158992982016,“model”:“....}],

$.getJSON(' ...

  $.each(data, function(i,item){ ...

    item['pk'] = 533001015899298270000 instead of 533001015899298254645
  }
}

我不确定我是否会在GAE服务器上遇到同样的问题。是否有限制ID大小的想法?

我正在使用Django,但我遇到了与Django和Google Models相同的问题。

更新

我找到了一个解决方案,它不会强制您更改项目的所有javascript代码。在我的情况下很多。像每个人都说最好的事情是使用de PK(或ID)作为字符串。但我使用django序列化程序,在我的版本和JSON中,PK被设置为数字。简单的解决方案是在序列化程序类上更改它(或创建一个新的序列化程序,它扩展原始并更改它):

def end_object(self, obj):
       self.objects.append({
            "model"  : smart_unicode(obj._meta),
            "pk"     : smart_unicode(obj._get_pk_val(), strings_only=**False**),
            "fields" : self._current
        })
        self._current = None

将strings_only置于False。它使得JSON上的pk带引号。所有的javascript代码都可以正常运行。

问题是......有没有其他方法可以强制django序列化程序将其作为String?

2 个答案:

答案 0 :(得分:2)

无法在JavaScript中准确读取/存储此数字,因为在JavaScript中,数字实际上是双精度浮点数,最大值为900,719,925,4740,992

你可以

  • 将id返回为字符串或
  • 使用参数dev_appserver.py
  • 启动--auto_id_policy=sequential

答案 1 :(得分:1)

如果由于某些奇怪的原因,Lipi的答案没有涵盖你,你可以尝试另一个 将所有值转换为字符串的方法。所以你会有

[{"pk": "5330010158992982016", "model": " .... "}],

我看到你正在使用Ajax调用,这可能意味着你不需要以下部分 对于Django变量而不是{{my_id}},如果要在渲染时创建JavaScript变量,可以使它成为'{{my_id}}'之类的字符串。

AppEngine团队了解此问题,并且会在更新生产之前解决。