从现有Model实例中删除属性

时间:2010-01-06 12:44:58

标签: google-app-engine

我有一个带有大blob属性User.image的Model 在我的模型中使用此属性会使我的查询花费太多时间并超过截止日期,因此我决定将该属性移动到另一个模型 - UserData - 其父级是用户。

但是,即使模型定义不再包含该属性,数据存储区中已有的现有模型实例仍包含该图像数据。

有没有从User实例中删除该数据的方法?

2 个答案:

答案 0 :(得分:12)

您的问题的答案记录在此处:https://developers.google.com/appengine/articles/update_schema

从“从数据存储中删除已删除的属性”部分进行复制/粘贴:

  

如果您从中移除了某个属性   模型,你会发现现有的   实体仍然拥有该财产。它   仍将显示在管理员中   控制台,仍然会出现在   数据存储区。要真正清理掉   旧数据,你需要循环   您的实体并从中删除数据   每一个。

     
      
  1. 确保已从模型定义中删除了属性。
  2.   
  3. 如果您的模型类继承自db.Model,请暂时将其切换   从db.Expando继承。 (db.Model   实例无法修改   动态,这是我们需要的   做下一步。)
  4.   
  5. 循环通过现有实体(如上所述)。对于每一个   实体,使用delattr删除   过时的属性,然后保存   实体。
  6.   
  7. 如果您的模型最初是从db.Model继承的,请不要忘记   更新全部后更改它   数据。
  8.   

答案 1 :(得分:-1)

我目前没有办法对此进行测试,但在转换为使用UserData类时,我会尝试将image属性设置为null或None(不确定是否使用Java或Python)。您可以在代码中内联执行此操作作为弃用属性的方法,或者您可以设置一次执行此操作的cron作业。我不确定是否有更好的方法可以从实体中完全删除图像属性,但这至少可以解决您的加载时间问题。