【问题标题】:'.....' object is not iterable in django'.....' 对象在 Django 中不可迭代
【发布时间】:2016-05-11 18:25:20
【问题描述】:

我有 3 个模型:User、Choice、Card。每个用户将查看同一组 10 张卡片并决定每张卡片是否重要。

以下是我如何定义类及其关系

在models.py中:

class Choice(models.Model):
    user = models.ForeignKey(User)
    card = models.ManyToManyField(Card)
    is_important = models.NullBooleanField()

class Card(models.Model):
    card_number = models.IntegerField(primary_key=True)
    content = models.TextField(null=False)

在views.py中

(我尝试保存用户对卡片的选择。)

def listings(request):
   user = request.user
   choice = Choice.objects.create(user=user, is_important = True)
   choice.card= Card.objects.get(1)

但是,我得到了这个错误

'Card' object is not iterable

你能告诉我错误在哪里吗?

非常感谢!

【问题讨论】:

  • Card.objects.get(1) 不是有效的 django 语法。你想在那里做什么?
  • 您的意思是改用choice.card = Card.objects.get(card_number = your_number) 吗?
  • 另外,如果写得正确,它会返回一个汽车对象,而不是很多。
  • 谢谢大家!我是 Django 新手,面临截止日期的压力,所以我没有时间从头开始阅读 Django 的结构来打基础。

标签: python django


【解决方案1】:

您可以像这样针对多对多字段添加对象

card =  Card.objects.create(card_number=any_number, content='abc')   
choice.card.add(card)

【讨论】:

    【解决方案2】:

    首先,您似乎在第一个 .get() 参数中忘记了 pk=Card.objects.get(pk=1)

    其次,Choice.cards 是一个 ManyToManyField,它需要一个项目列表,而不是一个特定的项目。你应该设置它:

    choice.card.set(Card.objects.filter(pk=1))
    

    请注意直接分配=will be deprecated from Django 1.10 and deleted in Django 2.0

    .filter() 将返回一个 QuerySet(它是可迭代的)。我认为你想要一个 ForeignKey 而不是 M2M 字段,在这种情况下你的代码可以工作(加上额外的 pk=)。

    【讨论】:

      【解决方案3】:

      在你的函数中:

      def listings(request):
         user = request.user
         choice = Choice.objects.create(user=user, is_important = True)
         choice.card= Card.objects.get(1)
      

      以下行试图获取 Card 对象。但是,我们需要指定要获取的卡。 如果使用 id,则查询为:

       choice.card= Card.objects.get(pk=1)
      

      或者使用 id 列表:

       choice.card = Card.objects.filter(pk__in=[12,22])
      

      如果使用 card_number 字段:

       choice.card= Card.objects.get(card_number=1)
      

      或者使用card_numbers列表:

       choice.card = Card.objects.filter(card_number__in=[12,22])
      

      【讨论】:

        猜你喜欢
        • 2013-10-10
        • 2021-08-02
        • 2021-07-04
        • 2021-02-04
        • 2020-02-28
        • 2013-05-07
        • 2019-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多