Django - 无法解包非可迭代ManyRelatedManager对象

3

我想显示一张表中不出现在另一张表中的物品列表。但是我一直遇到错误,比如“无法解包非可迭代ManyRelatedManager对象”。

我尝试了很多django过滤器和排除的变体,但总是会出现上述错误,或者根据我尝试的其他东西而定:

User对象没有属性profile

或者

无法解包非可迭代整数对象

模型:

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()

items.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显示所有不在用户资料中的物品。无论我尝试什么,似乎都不起作用,所以非常感谢任何帮助。

2个回答

6

替换:

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将包含所有与user_obj相关的User对象中的Item对象的查询集。

items将包含所有Item对象的查询集,不包括user_obj相关的对象。

您之前出错是因为filter()需要从模型中获取字段:

  • filter(user='some user')

有关如何进行查询的更多信息,请参阅文档


当我尝试这个时,我遇到了错误: 无法将关键字'user'解析为字段。可选项为:item_name、id、profile。 - momozar
1
好的,我通过更改 user_items = Items.objects.filter(user=user_obj) 为 user_items = Items.objects.filter(profile=user_obj) 解决了问题。现在完美运行。感谢您的帮助。 - momozar

1

try using:

from django.shortcuts import get_list_or_404

items = get_list_or_404(Item, user=user_obj) 

如果那不起作用,尝试使用“uing”。
from django.shortcuts import get_object_or_404

items = get_object_or_404(Item, user=user_obj) 

此外,您的间距有误。将“user_obj”制表符移动一下,尽管我认为这只是一个笔误,而不是代码错误。 - Jay
尝试这个会得到与其他答案相同的错误: 无法将关键字'user'解析为字段。可选项为:item_name、id、profile。 - momozar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接