将变量添加到模型对象列表中的每个对象

时间:2012-08-20 23:58:26

标签: python google-app-engine

我有以下模型类:

class Collection(db.Model):
  name = db.StringProperty()
  text_keys = db.ListProperty(db.Key)

class Text(db.Model):
  name = db.StringProperty()
  content = db.StringProperty()

我正在尝试执行以下操作:

class Collections(webapp.RequestHandler):
  def get(self):
    collections = model.Collection.all() # works fine

    for c in collections:
      c.number_of_texts = len(c.text_keys) # does not work

    template_values = {
      'collections': collections,
    }

我当然不是python专家,但是不应该这样做吗?

更新:

By不起作用我的意思是变量number_of_texts没有添加到模型对象中。

在我的django-template中,除了集合名称之外,以下代码不生成任何内容:

{% for c in collections %}
<p>{{c.name}}, number of texts: {{c.number_of_texts}}</p>
{% endfor %}

解决方案:

感谢RocketDonkey指出这可以使用django格式以更加优雅的方式完成:

{% for c in collections %}
<p>{{c.name}}, number of texts: {{c.text_keys|length}}</p>
{% endfor %}

或者通过将带有名称和长度的单独字典传递给模板,如果出现类似的问题而没有良好的格式化解决方案。

1 个答案:

答案 0 :(得分:1)

因此,您似乎正在尝试写入number_of_texts模型的Collection属性(不存在:))。如果您只需要获取该列表元素中的项目数,则需要将其存储在与c无关的单独变量中:

for c in collections:
  number_of_texts = len(c.text_keys)

为了将列表的长度添加到您的文档中(假设您在其他任何地方都不需要它),请尝试使用模板中的length函数:

{% for c in collections %}
    <p>{{c.name}}, number of texts: {{c.text_keys|length}}</p>
{% endfor %}

这可能不起作用取决于你的模板引擎(我只使用了一个,所以我远非专家),但它有望为你提供你想要的东西。