2009-07-06 60 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

我也推薦在開發應用程序服務器的交互式控制檯中使用此代碼。