2

我自从更新 GAE Launcher 以来,它在数据存储上创建的 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 模型时遇到了同样的问题。

更新:

我找到了一个解决方案,它不会强迫您更改项目的所有 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 序列化程序将其作为字符串?

4

2 回答 2

2

没有办法在 JavaScript 中准确地读取/存储这个数字,因为在 JavaScript 中数字实际上是双精度浮点数,最大值是900,719,925,4740,992.

你可以

  • 将 ID 作为字符串返回,或者
  • dev_appserver.py一个参数开始:--auto_id_policy=sequential
于 2013-04-02T13:50:51.893 回答
1

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

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

我看到您正在使用 Ajax 调用,这可能意味着您不需要以下部分,但是对于您来说,Django 变量而不是{{my_id}}您可以将其设为字符串,就像'{{my_id}}'您在渲染时创建 JavaScript 变量一样。

AppEngine 团队已意识到该问题,并将在生产中推出更新之前解决该问题。

于 2013-04-02T14:09:55.223 回答