2009-07-06 80 views
0

如何从我的任务模型中获取标签数据?App Engine db.model参考问题

class Task(db.Model): 
    title = db.StringProperty() 

class Label(db.Model): 
    name = db.StringProperty() 

class Tasklabel(db.Model): 
    task = db.ReferenceProperty(Task) 
    label = db.ReferenceProperty(Label) 

创建关联是没有问题的,但我怎么能在与像一个任务相关联的标签获得:

task = Task.get('...') 
for label in task.labels 

回答

1

你不想在任务ListProperty这样做了许多-太多?

class Label(db.Model) 
    name = db.StringProperty() 

    @property 
    def members(self): 
     return Task.gql("WHERE labels = :1", self.key()) 

class Task(db.Model) 
    title = db.StringProperty(); 
    labels = db.ListProperty(db.Key) 

那么你可以做

foo_label = Label.gql("WHERE name = 'foo'").get() 
task1 = Task.gql("WHERE title = 'task 1'").get() 
if foo_label.key() not in task1.labels: 
    task1.labels.append(foo_label.key()) 
task1.put() 

有关于Google code建模实体关系的深入文章。我从本文中偷取了上面的代码。

+0

这可能是解决方案,我以为我可以做到这一点 – 2009-07-06 19:28:44

+0

如果我问为什么? appengine数据存储似乎可以很容易地消除RDBMS中常见的连接表,如TaskLabel。 – seth 2009-07-06 21:03:42

2

这为我工作与您现有的数据模型:

taskObject = db.Query(Task).get() 
for item in taskObject.tasklabel_set: 
     item.label.name 

或者你可以移除标签类,只是做任务和TaskLabel之间的一个一对多的关系:

class Task(db.Model): 
     title = db.StringProperty() 

class TaskLabel(db.Model): 
     task = db.ReferenceProperty(Task) 
     label = db.StringProperty() 

然后

taskObject = db.Query(Task).get() 
for item in taskObject.tasklabel_set: 
     item.label 

这是一篇来自Google关于数据建模关系的文章tore

通过将其定义为ReferenceProperty,您已创建一个属性,该属性只能分配'Task'类型的值。每次定义一个引用属性时,它都会在被引用的类上创建一个隐式集合属性。默认情况下,这个集合称为_set。在这种情况下,它会创建一个属性Task.tasklabel_set。

该文章可以找到here

我也推荐在开发应用程序服务器的交互式控制台中使用此代码。