首页 > 解决方案 > Django - 无法解压不可迭代的 ManyRelatedManager 对象

问题描述

所以我试图显示一个表中没有出现在另一个表中的项目列表。但我不断收到诸如“无法解压缩不可迭代的 ManyRelatedManager 对象”之类的错误

我尝试了许多 django 过滤器和排除的变体,但总是存在上述错误或取决于我尝试过的其他事情:用户对象没有属性配置文件或无法解压缩不可迭代的 int 对象

楷模:

class Item(models.Model):
    item_name = models.CharField(max_length=200)    
    def __str__(self):
        return self.item_name
    class Meta:
        verbose_name = "Item"
        verbose_name_plural = "Items"



class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="user") 
    items = models.ManyToManyField(Item)

    class Meta:
        verbose_name = "Profile"
        verbose_name_plural = "Profiles"

意见:

python
@login_required
def item_view(request):
    if request.method == 'GET':
    user_obj = request.user.user
        items = Item.objects.filter(user_obj.items)
        context_dict = {'items': items}
        return render(request, 'site/items.html', context_dict)
    else:
        return HttpResponseNotFound()

项目.html:

{% for i in items%}
      <li><input type="checkbox" data-pk="{{i.pk}}" name="{{i.item_name}}" value="{{i.pk}}" onchange="processChange(this)"> {{i.item_name}}<br>
      </li>
{% endfor %}

目标是让 items.html 显示所有不在用户配置文件中的项目。我似乎尝试的一切似乎都不起作用,因此非常感谢任何帮助。

标签: django

解决方案


代替:

items = Item.objects.filter(user_obj.items)

和:

user_items = Items.objects.filter(profile=user_obj)
items = Items.objects.exclude(pk__in=user_items)

user_items将包含一个查询集,其中包含与inItem相关的所有对象。Useruser_obj

items将包含一个包含所有Item对象的查询集,不包括User与in相关的对象user_obj

您收到错误是因为filter()需要模型中的字段:

  • filter(user='some user')

可以在文档中阅读有关如何进行查询的更多信息


推荐阅读