【问题标题】:Django - dreaded 'iteration over non-sequence'Django - 害怕“对非序列的迭代”
【发布时间】:2010-08-25 11:01:57
【问题描述】:

您好,我希望根据俱乐部的来源来填充会员列表。

这是我的代码:

 members = []
 if userprofile.countries.count() > 0:
     for c in userprofile.countries.all():
         clubs = Club.objects.filter(location__country = c)
         for club in clubs:
             members_list = Member.objects.get_members(club)
             for m in members_list:
                 members.append(m)

但是,在评估 for m in members_list: 时,它会引发“对非序列的迭代”

我不完全确定为什么?谁能给我任何想法?!

编辑:

使用以下方法解决:

members = []
if userprofile.countries.count() > 0:
            members_list = member.objects.filter(memberstoentities__club__location__country__in = userprofile.countries.all())
            for m in members_list:
                members.append(m)

【问题讨论】:

  • 你能把Member模型的来源贴出来吗?
  • Member.objects.get_members 应该返回什么?我猜它会返回一个列表,但显然它不会(None?)...
  • Member.objects.get_members(club) 做了哪些club.member_set.all() 无法提供的服务?
  • Member.objects.get_members(club) 返回与该俱乐部关联的用户的查询集。 club.member_set.all() 似乎不起作用。

标签: python django django-models django-queryset


【解决方案1】:

除非查看会员模型,否则无法发表评论。但是

  1. 我们不能在返回导航中使用 .filter,而不是 get_members
  2. 我们是否需要那么多循环和循环内的数据库访问?例如:

clubs = Club.objects.filter(location__country__in = list_of_user_countries)

如果你的最终列表是成员列表,你可以按照我上面提到的那样做(至少以优化的方式)

【讨论】:

  • 谢谢!通过复合查询并使用您的方法,我已经设法解决了!
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2017-04-19
  • 2014-03-16
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多