如何使用模板显示具有一对多关系的模型(种类)?

时间:2012-05-04 14:16:25

标签: django google-app-engine google-cloud-datastore

我有两个模型,如下:

class A(db.Model):
    propertyA = db.XxxProperty(required=True)

class B(db.Model):
    reference = db.ReferenceProperty(A,collection_name='Bs',required=Ture)
    propertyB = db.XxxProperty(required=True)

现在,我想显示所有As使用模板的信息。在python文件中,我这样做:

As = A.all().filter('propertyA =', XXX).fetch(10)

我将As传递给模板,如下所示:

{% for a in As%}
    {{a.propertyA}}
    *****SHOW EVERY B THAT a HAS*****
{% endfor%}

这是问题,每个A可能有很多B,我需要这样的东西:

a_has_these_Bs = a.BS
for b in a_has_these_Bs:
    b.propertyB

但是如何将查询内容放入模板中呢? 有没有其他方法可以实现我的意图?

谢谢!

2 个答案:

答案 0 :(得分:3)

这就是collection_name的用途。 A有一个属性Bs,这是一个返回引用B的{​​{1}}个对象的查询。

所以你想要像A这样的东西,虽然我没有任何方便的东西来测试它。

答案 1 :(得分:1)

你可以使用@property函数

class A(db.Model):
    propertyA = db.XxxProperty(required=True)

    @property
    def has_these_bs(self):
        objs = B.all().filter('reference =', self)
        return [b for b in objs]

class B(db.Model):
    reference = db.ReferenceProperty(A,collection_name='Bs',required=Ture)
    propertyB = db.XxxProperty(required=True)

然后在模板中:

for b in a.has_these_Bs:
    b.propertyB

当然它不是做B.all().filter('reference =', self)然后遍历该查询的最佳解决方案。如果您知道实体A有多少B或者它可能拥有的最大数量,那么获取像B.all().filter('reference =', self).fetch(500)这样的结果会好得多。