如何从我的任务模型中获取标签数据?
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
答案 0 :(得分:2)
这适用于我当前的数据模型:
taskObject = db.Query(Task).get()
for item in taskObject.tasklabel_set:
item.label.name
或者你可以删除Label类,只在Task和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文章中有关数据存储区中建模关系的提示
通过将其定义为ReferenceProperty,您创建了一个只能为“Task”类型指定值的属性。每次定义引用属性时,它都会在引用的类上创建隐式集合属性。默认情况下,此集合称为_set。在这种情况下,它将创建一个属性Task.tasklabel_set。
可以找到该文章here。
我还建议在dev appserver的交互式控制台中使用此代码。
答案 1 :(得分: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上建模实体关系的文章。我从这篇文章中偷了上面的代码。