【问题标题】:Object is not iterable in django对象在 Django 中不可迭代
【发布时间】:2013-10-10 03:02:56
【问题描述】:

当我尝试在 Django 中从数据库中迭代对象时,它给了我一个错误。我真的不知道为什么。它给了我这个错误:“'Clovek' object is not iterable”

user=request.user
user=Clovek.objects.all().filter(user=user)
user=user[0]
prvni_prihlaseni=False
first=True
for i in user:

【问题讨论】:

  • docs.python.org/2/glossary.html#term-iterable 对象用户是不可迭代的,它完全有意义。用户,列表而不是对象(更改命名),是可迭代的(列表)。
  • 问题未反映真实意图/研究不力。 “但我只想迭代一个用户,以及该对象中的每个变量,因为我想知道对象中的任何变量是否为空白”。

标签: python django python-3.x django-views


【解决方案1】:

除非您在模型中定义了__iter__,否则您无法迭代模型对象。

您的意思是迭代Clovek.objects.all().filter(user=user) 返回的查询集吗?然后,我认为这是一个错字:

user = request.user
users = Clovek.objects.all().filter(user=user)
#   ^      v
user = users[0]
prvni_prihlaseni=False
first=True
for i in users:
#            ^

【讨论】:

  • 这不是错字,因为从查询集中它只有一个对象,我想迭代该对象中的每个变量
  • @user2771714, every variable?那是什么意思?是否要迭代所有字段的值?
  • 是的,但我已经通过 usera._meta.get_all_field_names() 和 getattr() 弄清楚了
  • @user2771714,您尝试过Clovek.objects.all()[:1].values()Clovek.objects.all()[:1].values_list() 吗?
【解决方案2】:

在阅读了您的 cmets 并弄清楚您想要做什么之后,发现了这个,以迭代模型的字段:

model._meta.get_all_field_names() 将为您提供模型的所有字段 名称,然后您可以使用 model._meta.get_field() 以您的方式工作 详细的名称,以及 getattr() 从模型中获取值。

来自this post

【讨论】:

    【解决方案3】:

    问题出在这里:

    user=Clovek.objects.all().filter(user=user)
    user=user[0]
    

    只需设置一个不同的变量名。不要对两者使用相同的。

    您不能循环遍历user。代码中的变量 user 设置为不可迭代的 user[0]。您需要遍历查询集 Clovek.objects.all().filter(user=user) 以便打印结果。

    这将起作用:

    users = Clovek.objects.all().filter(user=user)
    for i in users:
        print i
    

    这行不通:

    users = Clovek.objects.all().filter(user=user)
    user = users[0]
    for i in user: # user is not an iterable but users is. 
        print i
    

    一个例子:

    users = Clovek.objects.all().filter(user=user)
    # in case there's only 1 result.
    # user = users[0]
    # you can access any of its field
    # user.id, user.whatever
    
    # in case there's more than 1:
    for i in users:
        print i.id
    

    【讨论】:

    • 即使我更改了变量的名称,它也不起作用。 user=request.user usera=Clovek.objects.all().filter(user=user) users=usera[0] prvni_prihlaseni=False first=True for i in users:
    • 但我只想迭代一个用户,以及该对象中的每个变量,因为我想知道对象中的任何变量是否为空
    • 您可以访问像users[0].fielduser.field 这样的任何字段,如果user=users[0]。无需循环。
    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 2021-07-04
    • 2021-02-04
    • 2020-02-28
    • 2013-05-07
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多