我的最终目标很简单。我需要一个实体,它有两个唯一的索引字段,可以像键一样操作。如果这是一个SQL数据库,那么等价物将有两个字段,它们都被定义为唯一的,并且彼此独立。我知道这个功能不可能直接用于一个数据存储数据库模型,所以我不得不创建一个模拟这种行为的父子模型场景。在
为了解决这个问题,我创建了两个模型(ParentEntity和ChildEntity)数据库模型它存储两个键的两个值,但只有一个键被分配给模型1的键名称参数。在
在创建父实体之后,我创建第二个子实体,方法是将第二个键指定为键名称,并将我刚刚创建的父实体分配给新ChildEntity对象构造函数中的child entitiesparent参数。在
我的假设是,这将使这些实体保持在同一个实体组中,因为这正是google文档所暗示的。在
我已经向ParentEntity添加了一个名为InsertData的插入方法(它可以很容易地放在ChildEntity中),我可以调用它来控制插入逻辑,并尝试通过事务插入这些记录。在
当我调用InsertData时,我得到以下错误:
Cannot operate on different entity groups in a transaction: (kind='ChildEntity', name='key_name > 2') and (kind='ParentEntity', name='key_name 1').
如果我的第二个(ChildEntity)实体被分配给parent参数的第一个实体(ParentEntity),这两个实体不应该在同一个实体组中吗?在
提供的代码是我试图实现的功能副本。唯一的区别是,在ChildEntity中存储了一些额外的属性,在txn()定义之前进行了一些数据验证,对于这个问题,我已经将字段的名称改为更有意义的名称。在
class ParentEntity(db.Model):
str1_key = db.StringProperty()
str2 = db.StringProperty()
@staticmethod
def InsertData(string1, string2, string3):
try:
def txn():
#create first entity
prt = ParentEntity(
key_name=string1,
str1_key=string1,
str2=string2)
prt.put()
#create User Account Entity
child = ChildEntity(
key_name=string2,
parent=prt,
str1=string1,
str2_key=string2,
str3=string3,)
child.put()
return child
db.run_in_transaction(txn)
except Exception, e:
raise e
class ChildEntity(db.Model):
#foreign and primary key values
str1 = db.StringProperty()
str2_key = db.StringProperty()
#pertinent data below
str3 = db.StringProperty()
我已经解决了上面提到的问题。如前所述,我的实际类包含InsertData方法中的一些验证代码。部分验证逻辑发生在txn()方法中。我假设这不会是一个问题,因为我的验证所做的就是检查以确保在某些参数中有文本值,并且一个特定参数具有一定的长度。在
在我将验证从txn()方法中移走之后,插入操作就可以正常工作了。杰出的!在
相关问题 更多 >
编程相关推荐