我从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?
答案 0 :(得分:2)
无法在JavaScript中准确读取/存储此数字,因为在JavaScript中,数字实际上是双精度浮点数,最大值为900,719,925,4740,992
。
你可以
dev_appserver.py
--auto_id_policy=sequential
答案 1 :(得分:1)
如果由于某些奇怪的原因,Lipi的答案没有涵盖你,你可以尝试另一个 将所有值转换为字符串的方法。所以你会有
[{"pk": "5330010158992982016", "model": " .... "}],
我看到你正在使用Ajax调用,这可能意味着你不需要以下部分
对于Django变量而不是{{my_id}}
,如果要在渲染时创建JavaScript变量,可以使它成为'{{my_id}}'
之类的字符串。
AppEngine团队了解此问题,并且会在更新生产之前解决。