Python App Engine db.model参考问题

Python App Engine db.model参考问题,python,google-app-engine,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) 创建关联没有问题,但是如何获取与以下任务关联的标签:

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

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
难道你不想让这样的任务做很多对很多吗

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()
有一篇关于在上建模实体关系的详尽文章。我从这篇文章中窃取了上面的代码。

难道你不想让这样的任务执行多对多吗

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()

有一篇关于在上建模实体关系的详尽文章。我从这篇文章中窃取了上面的代码。

这对我来说适用于您当前的数据模型:

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()
然后

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

通过将其定义为ReferenceProperty,您已经创建了一个只能为“Task”类型的值赋值的属性。每次定义引用属性时,它都会在引用的类上创建一个隐式集合属性。默认情况下,此集合称为_set。在本例中,它将设置属性Task.tasklab_

这篇文章可以找到


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

这对我来说适用于您当前的数据模型:

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()
然后

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

通过将其定义为ReferenceProperty,您已经创建了一个只能为“Task”类型的值赋值的属性。每次定义引用属性时,它都会在引用的类上创建一个隐式集合属性。默认情况下,此集合称为_set。在本例中,它将设置属性Task.tasklab_

这篇文章可以找到


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

这可能是解决方案,我想我可以不用问为什么就可以这样做?appengine数据存储似乎很容易消除RDBMS中常见的TaskLabel之类的联接表。我发现使用listproperty可能是正确的解决方案,这可能就是解决方案,我想我可以毫不犹豫地这样做,如果我问为什么?appengine数据存储似乎很容易消除RDBMS中常见的TaskLabel等联接表。我发现使用listproperty可能是正确的解决方案。我如何“在dev appserver上的交互控制台中处理此代码”?Django有一个,但我还没有为GAE找到一个。当您在本地机器上运行dev_appserver时,您可以转到那里测试代码片段。要使代码正常工作,您必须提供常用的导入语句。键入您的代码并点击底部的“运行程序”。这是否回答了您的问题?我如何“在dev appserver的交互式控制台中使用此代码”?Django有一个,但我还没有为GAE找到一个。当您在本地机器上运行dev_appserver时,您可以转到那里测试代码片段。要使代码正常工作,您必须提供常用的导入语句。键入您的代码并点击底部的“运行程序”。这是否回答了您的问题?