将IntegerProperty更改为现有AppEngine DataStore的FloatProperty

时间:2011-01-20 02:16:56

标签: python django google-app-engine google-cloud-datastore

我构建了一个appengine应用程序(python),它需要将整数值(100)中的现有数据存储区实体转换为浮点值(100.00)以进行货币转换问题。 这样做的正确方法怎么样?由于我的查询在我只更改模型中的属性类型时返回错误。

旧模型:

class Learn(search.SearchableModel):
    pid = db.ReferenceProperty(Product, collection_name='picks')
    title = db.StringProperty()
    description = db.TextProperty()
    order = db.IntegerProperty()
    cost = db.IntegerProperty(default=0)
    cost1 = db.IntegerProperty(default=0)

新模式:

class Learn(search.SearchableModel):
    pid = db.ReferenceProperty(Product, collection_name='picks')
    title = db.StringProperty()
    description = db.TextProperty()
    order = db.IntegerProperty()
    cost = db.FloatProperty(default=0.000)
    cost1 = db.FloatProperty(default=0.000)

我需要一种正确的方法来更改此数据存储区属性类型,而无需更改(删除旧的和添加新的)现有数据。因为它的关键用于许多其他表/模型。

感谢。

4 个答案:

答案 0 :(得分:12)

最简单的方法是将模型更改为从db.Expando继承,并从定义中删除整数属性。然后,加载每个实例并在每个实例上执行“instance.foo = float(instance.foo)”,然后将它们保存回数据存储区 - 您可能希望为此使用mapreduce API。最后,让模型再次扩展db.Model,并重新添加FloatProperties。

你真的,真的不想使用浮动货币,但浮动很容易出现舍入误差,这意味着你可能会损失(或获得!)钱。相反,使用一个计算分数的IntegerProperty。

答案 1 :(得分:7)

以下是Nick Johnson answer的示例:

Before

class Person(db.Model):
    name = db.StringProperty()
    age = db.StringProperty() #this will go to int

After

class Person(db.Expando):
    pass

for person in Person.all():
    person.age = int(person.age)
    person.put()

Very after

class Person(db.Model):
    name = db.StringProperty()
    age = db.IntegerProperty() 

答案 2 :(得分:0)

也许一个好方法是临时创建一个新模型:

class LearnTemp(search.SearchableModel):
    pid = db.ReferenceProperty(Product, collection_name='picks')
    title = db.StringProperty()
    description = db.TextProperty()
    order = db.IntegerProperty()
    order = db.IntegerProperty()
    cost = db.FloatProperty(default=0.000)
    cost1 = db.FloatProperty(default=0.000)

然后编写一些脚本,任务或视图,将实例从旧模型转换为临时模型,将整数值转换为float。如果可能的话,确保复制id和密钥。

更改主模型后,将所有条目从临时条目复制到其中。然后删除临时模型。

这很可能不是最佳方式,需要一些手动迁移,但如果没有南方和应用引擎,我真的没有看到一个好方法。

答案 3 :(得分:-1)

从数据存储管理界面的“编辑实体”页面:

  

输入实体的信息   下面。如果你想改变一个   属性的类型,将其设置为Null,保存   实体,再次编辑实体,和   改变类型