Python 向模型对象列表中的每个对象添加变量

Python 向模型对象列表中的每个对象添加变量,python,google-app-engine,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 g

我有以下模型类:

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专家,但这不应该奏效吗

更新:

所谓不工作,我的意思是可变数量的_文本不会添加到模型对象中

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

{% for c in collections %}
<p>{{c.name}}, number of texts: {{c.number_of_texts}}</p>
{% endfor %}
{%forc在集合%}
{{c.name},文本数:{{c.number}u of_text}

{%endfor%}
解决方案:

感谢RocketDonkey指出,可以使用django格式以更为优雅的方式完成这项工作:

{% for c in collections %}
<p>{{c.name}}, number of texts: {{c.text_keys|length}}</p>
{% endfor %}
{%forc在集合%}
{{c.name},文本数:{{c.text_keys | length}

{%endfor%}

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

因此,您似乎正在尝试写入
集合
模型(不存在:)的
文本数
属性。如果只需要获取该列表元素中的项数,则需要将其存储在一个单独的变量中,该变量不绑定到
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 %}
{%forc在集合%}
{{c.name},文本数:{{c.text_keys | length}

{%endfor%}

根据模板引擎的不同,这可能不起作用(我只使用了一个,所以我不是专家),但希望它能满足您的需要。

我意识到,在Collection类中使用一个变量来计算关联文本的数量可能更好,但我不时需要链接一个新变量(如本例中的_文本数)添加到每个模型对象,以便可以在django模板for循环中使用。“#不起作用”…你这是什么意思?是否引发了异常?如果是,你能发布回溯吗?如果没有异常,什么不起作用?对不起,我的文档记录得很差。所谓不起作用,我的意思是它只是不向集合中的每个对象添加变量numberOfText,例如,以下模板不生成任何内容{%forc在集合%}{c.number_of_text}

{%endfor%}但是,如果你给一个对象添加了一个属性,然后将该对象传递给模板,它应该可以工作。因此,它不能工作仍然是一个谜。也许你的模板中有一个输入错误?谢谢你的回答,我想我可以用一个额外的属性来扩展对象,只是为了生成html页面,但这可能是错误的不可能?我可以将其存储在单独的变量中(例如,数字列表),但在尝试将文本数量链接到django中正确的集合名称时遇到了麻烦-template@user1612947明白了,你上面的扩展帖子很有意义。现在修改我的答案。我问这个问题的原因是因为我倾向于遇到这样一个问题:在从d中提取对象后,向其添加一些快速计算的属性atastore经常出现,但不一定感觉需要永久存储。@user1612947是的,完全有道理。如果上述方法不起作用,您也可以尝试创建一个单独的字典,该字典由
Collection.name
键入,值为
text\u keys
的长度。然后您可以传递该字典将y与
集合一起添加到模板中,然后使用它查找迭代的任何
c.name
的长度(从未尝试过,因此请谨慎使用)。谢谢你提供了一个优雅的解决方案!效果很好。我也会试试字典,听起来对稍微复杂一些的情况来说是一个合理的解决方案。