【问题标题】:What's the alternative to back-reference property in NDB?NDB 中反向引用属性的替代方法是什么?
【发布时间】:2012-06-22 18:48:42
【问题描述】:

我已阅读this question 和简单明了的答案,但在我的情况下它没有用,因为答案不考虑嵌套的for。请看代码:

class SuperCat(ndb.Model):

class Category(ndb.Model):
  supercat = ndb.KeyProperty(kind=SuperCat)

class SubCat(ndb.Model):
  category = ndb.KeyProperty(kind=Category)

处理程序:

Categories = ndb.gql("SELECT * FROM Category WHERE supercat = :1", supercat_key)
self.generate('supercat.html', {'Categories': Categories})

在模板中,使用旧的 db.Model 和反向引用属性就足够了:

{{ for Category in Categories }}
  {{ for SubCat in Category.subcat_set }} # this is the back-reference in action

提供这种数据结构的同样简单的替代方案是什么?

【问题讨论】:

标签: google-app-engine app-engine-ndb


【解决方案1】:

让我们系统地看一下。首先,db->ndb translation guide 告诉我们返回给定 Category 实例的 SubCategory 实例的查询如下:

  subcats_query = SubCategory.query(SubCategory.category == cat.key)

(请注意,我对实例/实体使用小写名称,对类/模型使用 CapWords。所以 cat 是一个类别实体。)

所以在 Python 中,我们将编写你的双循环如下:

  for cat in categories:
    for subcat in SubCat.query(SubCat.category == cat.key):
      ...blah...

为了把它变成可以从模板中轻松访问的东西,让我们在 Category 类上定义一个新方法:

  class Category(ndb.Model):

    supercat = ndb.KeyProperty(kind=SuperCat)

    def subcat_set(self):
      return SubCat.query(SubCat.category == self.key)

注意这是一个方法;在 Python 中,你必须调用它:

  for cat in categories:
    for subcat in cat.subcat_set():
      ...blah...

但是在模板中你可以(必须)省略 () 调用语法,这样你就可以得到你想要的:

  {{ for cat in categories }}
    {{ for subcat in cat.subcat_set }}
      ...blah...

试一试!

【讨论】:

  • 有效!但只能在模板中使用 ()。没有 () 我得到一个 TypeError: 'instancemethod' object is not iterable.
  • 您使用的是什么模板系统?我认为 Django 会自动调用可调用对象。但也许 Jinja2 没有?如果你不喜欢 (),你可以用@property(小写'p',Python 内置)装饰方法。
猜你喜欢
  • 1970-01-01
  • 2012-04-12
  • 2015-08-01
  • 1970-01-01
  • 2017-07-27
  • 2019-04-27
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
相关资源
最近更新 更多