代码之家  ›  专栏  ›  技术社区  ›  Aun

应用引擎数据库模型参考问题

  •  0
  • Aun  · 技术社区  · 17 年前

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

    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 回复  |  直到 17 年前
        1
  •  1
  •   seth    17 年前

    你不想要一个 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 . 我从这篇文章中偷了上面的代码。

        2
  •  2
  •   Jason Rikard    17 年前

    这对您当前的数据模型很有用:

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

    或者,您可以删除Label类,只需在任务和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
    

    以下是谷歌关于在数据存储中建模关系的文章中的提示

    通过将其定义为referenceproperty,您创建了一个只能为“task”类型赋值的属性。每次定义引用属性时,都会在引用的类上创建隐式集合属性。默认情况下,此集合称为_set。在这种情况下,它将设置属性task.taskLabel_。

    这篇文章可以找到 here .

    我还建议在dev appserver上的交互式控制台中使用此代码。