【问题标题】:How can I iterate over ManyToManyField?如何迭代 ManyToManyField?
【发布时间】:2012-03-23 10:28:09
【问题描述】:

一个简单的问题,但我找不到答案。

我有一个带有 ManyToMany 字段的模型:

class Stuff(models.Model):
  things = models.ManyToManyField(Thing)

然后在另一个函数中我想这样做:

myStuff = Stuff.objects.get(id=1)
for t in myStuff.things.all:
  # ...

但这给了我:

TypeError: 'instancemethod' object is not iterable

如何迭代 manyToManyField ?

【问题讨论】:

  • "instancemethod object" 应该告诉你它是一个方法(需要括号),而不是一个可迭代对象。

标签: python database django orm model


【解决方案1】:

ManyToManyField 似乎有一种不同于基本 Django 类的 Manager。查看此处的源代码https://github.com/django/django/blob/master/django/db/models/fields/related_descriptors.py#L821,您似乎正在寻找related_val 字段,该字段似乎包含相关对象引用的元组。

【讨论】:

  • 啊我弄错了,Abid A 的回答确实有效。 :$
【解决方案2】:

就像 Abid A 已经回答了一样,您缺少括号 ()

for t in myStuff.things.all():
    print t.myStuffs.all()

【讨论】:

  • 那你为什么还要重复呢?你的例子被打破了......你想打印什么(最后有一个冒号)?
  • 那时我还没有在这里写 cmets 的权限,我的目的是展示一个真正的工作示例,用 for-loop 打印所有你无法展示的东西。有一个冒号是因为在 Python 中 for 循环总是需要一个!
  • 我相信我指的是您删除的额外冒号。但很公平......我确实发现完整的例子更容易理解。
【解决方案3】:

尝试在all 之后添加()myStuff.things.all()

【讨论】:

  • 在模板中使用myStuff.things.all(省略())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2016-04-09
  • 1970-01-01
  • 2021-06-22
  • 2011-12-29
  • 2010-11-02
  • 2011-05-27
相关资源
最近更新 更多