可以复制数据存储区key_name用于不同的实体类型,get_or_insert()

时间:2012-08-18 14:00:34

标签: python google-app-engine google-cloud-datastore primary-key

我有两种模型,CourtDays和天:

class CourtDays(db.Model):    #parent is Courts
    court = db.ReferenceProperty(Courts)
    reserveMaxTimeBefore = db.ListProperty(int)   
    reserveMinTimeBefore = db.ListProperty(int)
    day = db.StringProperty()

class Days (db.Model):
    court = db.ReferenceProperty(Courts)
    startTime = db.ListProperty(int)
    endTime = db.ListProperty(int)
    startTimeLunch = db.ListProperty(int)
    endTimeLunch = db.ListProperty(int)
    name = db.StringProperty()

我可以删除CourtDays中的“日期”和Days中的“名称”,而是使用key_name="day"key_name="name"来放置()这两种虽然“日”和“名字”是一周中的七天?请注意,CourtDaysDays都具有相同的ReferenceProperty (并且也将具有相同的父级)。此外,请注意其他CourtDays和Days将涉及相同的日期,但对于其他Courtlocations提供父级和引用的其他法院。

此外,方法get_or_insert()是否可用于确保CourtDaysDays实体(例如“星期一”)可以修改但保持唯一?我问,因为datastore docs说“get和后续(可能)put操作包含在事务中以确保原子性。这意味着get_or_insert() 永远不会覆盖现有实体 ,......“。尽管有这个短语并且因为它,这是否意味着“Model.get_or_insert(key_name,** kwds)”可以跟put()后面并覆盖特定实例?

1 个答案:

答案 0 :(得分:3)

如果两个实体具有不同的种类,名称空间或父级,则它们可以具有相同的key_name。如果两个键具有相同的种类,ids,parent和app_id,则它们都指向同一个实体。

我认为短语永远不会覆盖现有实体意味着如果存在具有此类密钥的实体(属性值不能满足),get_or_insert将永远不会将实体放入数据存储区。是的,跟着put()将覆盖该实例。