3

我正在尝试遍历 Expando-Model 的动态属性以将它们全部输出。除了创建自己的方法之外,还有其他方法吗:

class Event(db.Expando):
    platform = db.ReferenceProperty(Platform)
    date = db.DateTimeProperty()

    def getValues(self):
        return self._dynamic_properties

然后在模板中 - 传递一个“平台”对象:

{% for event in platform.event_set %}
    <b>{{ event.date }}</b><br />
    {% for pair in event.getValues.items %}
        {{ pair.0 }} = {{ pair.1 }}<br />
    {% endfor %}
{% endfor %}

这行得通,但我很惊讶我不能这样做:

{% for event in platform.event_set %}
    <b>{{ event.date }}</b><br />
    {% for pair in event.items %}
        {{ pair.0 }} = {{ pair.1 }}<br />
    {% endfor %}
{% endfor %}

没有我自己的方法调用......我应该使用'.items'以外的东西吗?

4

1 回答 1

0

您可以使用 db.Model 的 'dynamic_properties' 方法来检索 Expando 的属性,格式与 'properties' 方法相同(如Model 类中所述

请记住,这些函数不会返回属性的值,但是...“属性”返回映射到其实现类的属性名称字典(在本例中为 db.ReferenceProperty 和 db.DateTimeProperty),而“dynamic_properties”仅返回属性名称列表,因为 Expandos 无法将动态值映射到实现类。

为了获得财产的价值,你必须使用getattr(model, prop_name). 没有办法纯粹在 Django 模板中运行这个函数(没有自定义标签库),但是你可以像这样保留并重写你的方法......

def getExpandoValues(self):
   return dict((name, getattr(self, name)) for name, impl_class in self.dynamic_properties())

...并重新编写模板以通过新的字典输入访问值:

{% for event in platform.event_set %}
  <b>{{ event.date }}</b><br />
  {% for pair in event.getExpandoValues %}
     {{ pair.0 }} = {{ pair.1 }}<br />
  {% endfor %}
{% endfor %}
于 2010-12-08T07:57:41.707 回答