0

我希望能够使用 Google Endpoints 直接从消息中自动插入一个引用另一个实体的实体。

ReferenceProperty为了在消息中传输,我使用Key. 这对于发送消息很好,但是在接收消息并创建它的实体时,我不能只将编码字符串作为参数传递给构造函数。

例如,假设我有两个继承自BaseModel其自身继承自的类db.models

class TestModel2(models.BaseModel):
    test_string = db.StringProperty(required=True)

class TestModel(models.BaseModel):
    test2 = db.ReferenceProperty(TestModel2)
    test2_id = property(models.BaseModel._get_attr_id_builder('test2'),
                       models.BaseModel._set_attr_id_builder('test2'))

和一个消息类

class TestModelMessage(messages.Message):
    test2_id = messages.StringField(4)

我希望能够Entity TestModel直接创建一个TestModelMessage.

我设法使用属性以另一种方式(从实体到消息)来做到这一点。但另一方面它不起作用,因为我觉得构造函数db.models只会设置继承的属性db.Property。因此不会调用该属性的设置器...

我怎么能这样做?

我想过覆盖__init__inBaseModel但是当调用它__init__db.models它可能会覆盖ReferenceProperty.

4

1 回答 1

0

所以,我_ref_properties在类中添加了一个字段BaseModel。对于前面的示例,它将是_ref_properties = {'test2': 'test2_id'}

然后我添加了这个类方法

@classmethod
def from_message(cls, message, *args):
    attributes = {attr: getattr(message, attr) for attr in args}
    for attribute, property in cls._ref_properties.items():
        attributes[attribute] = db.Key(encoded=getattr(message, property))
    entity = cls(**attributes)
    return entity

它似乎有效。可能不是最好的。任何评论或更好的解决方案?

于 2013-05-11T06:46:38.123 回答