将IntegerProperty更改为现有AppEngine DataStore的FloatProperty

Iva*_*ter 5 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)
Run Code Online (Sandbox Code Playgroud)

新模式:

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)
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Nic*_*son 12

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

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

  • @Ivan我不是指两个整数 - 虽然这也会起作用 - 我只是想在一个字段中存储总分数.例如,$ 10.23存储为1023. (2认同)

asd*_*hak 7

这里是exampe对Nick Johnson答案:

Before:

class Person(db.Model):
    name = db.StringProperty()
    age = db.StringProperty() #this will go to int
Run Code Online (Sandbox Code Playgroud)

After

class Person(db.Expando):
    pass

for person in Person.all():
    person.age = int(person.age)
    person.put()
Run Code Online (Sandbox Code Playgroud)

Very after:

class Person(db.Model):
    name = db.StringProperty()
    age = db.IntegerProperty() 
Run Code Online (Sandbox Code Playgroud)