GAE数据存储区在python api中急切加载

时间:2010-01-20 01:15:03

标签: python google-app-engine google-cloud-datastore eager-loading pyamf

我有两个关于一对多的模型:

  

类问题(db.Model):

     
    

questionText = db.StringProperty(multiline = False)

  
     

类答案(db.Model):

     
    

answerText = db.StringProperty(multiline = False)

         

question = db.ReferenceProperty(Question,collection_name ='answers')

  

我在Flex中实现了前端,并使用pyamf加载数据。

当我尝试加载所有带有相关问题的答案时,一切都按预期工作,我可以访问 领域

  

answer.question

但是如果加载问题(例如通过Questions.all()),'question.answers'仍为空/ null

(虽然在服务器/ python方面,我可以毫无问题地修改question.answers - 可能是在延迟加载之后)。

那么可以加载所有问题和答案吗?

(我知道这在JPA Java api中是可能的,但是python呢?)

Shoud我使用其他设置,GQL查询或django框架来使其工作?

1 个答案:

答案 0 :(得分:1)

默认情况下,PyAMF不会对ReferenceProperty字段进行编码,除非它们已经由服务方法专门加载。这是有目的的,所以你最终的编码不会超过你的需要。

PyAMF查找一个特殊的类属性__amf__,它用于自定义该类型实例的编码和解码过程。有关详细信息,请参阅docs

因此,要强制对所有问题的所有答案进行编码,您应该能够做到:

class Question(db.Model):
    class __amf__:
        static = ('answers',)

    questionText = db.StringProperty(multiline=False)

class Answer(db.Model):
    answertText = db.StringProperty(multiline=False)
    question = db.ReferenceProperty(Question, collection_name='answers')

设置静态属性将确保每个Question实例都设置answers属性(通过getattr),这将依次进行您需要的数据存储区查找。

重要的是不要将此设置放在应用程序范围内,因此任何问题都会在实例上显示答案属性。