Django - не может распаковать не повторяемый объект ManyRelatedManager - PullRequest
1 голос
/ 21 мая 2019

, поэтому я пытаюсь отобразить список элементов из таблицы, которые не отображаются в другой таблице.Но я продолжаю получать ошибки, такие как «не могу распаковать не повторяемый объект 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()

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 ]

2 голосов
/ 22 мая 2019

Заменить:

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 будет содержать набор запросов со всеми Item объектами, связанными с User в user_obj.

items будет содержать набор запросов со всеми Item объектами, исключая те, которые связаны с User в user_obj

Вы получили ошибку, потому что filter() нужно поле из модели:

  • filter(user='some user')

Подробнее о том, как делать запросы, можно прочитать в документах

1 голос
/ 21 мая 2019

попробуйте использовать:

from django.shortcuts import get_list_or_404

items = get_list_or_404(Item, user=user_obj) 

, если это не сработает, попробуйте,

from django.shortcuts import get_object_or_404

items = get_object_or_404(Item, user=user_obj) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...