App Engine db.model参考问题

时间:2009-07-06 18:57:06

标签: python google-app-engine

如何从我的任务模型中获取标签数据?

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

2 个答案:

答案 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上建模实体关系的文章。我从这篇文章中偷了上面的代码。