Поле «идентификатор» ожидало номер, но получило [Объект запроса по адресу 0x000002CFD4506EC8>]

#python #django #django-models #django-views

Вопрос:

Я создаю блог-приложение и пытаюсь исключить записи с другим полем модели. НО когда я захожу в браузер, эта ошибка продолжает отображаться

Поле «id» ожидало номер, но получило [Объект запроса по адресу 0x000002CFD4506EC8>].

models.py

 class Post(models.Model):
    post_owner = models.ForeignKey(User,default='',null=True,on_delete = models.CASCADE)
    post_title = models.CharField(max_length=500,default='')
    tags = TaggableManager()

class AddFav(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE,related_name='parent_user')
    favourite_users = models.ManyToManyField(User, related_name='favourite_users', blank=True)
    blocked_tags = TaggableManager()
 

views.py

 def posts(request):
    block_or_not = AddFav.objects.filter(favourite_users=request.user)

    exclude_this_list = []

    for excluding in block_or_not:
        exclude_this = excluding.blocked_tags.all()
        exclude_this_list.append(exclude_this)

    posts = Post.objects.filter(date_added__lte=now).exclude(tags=exclude_this_list)
 

Я понятия не имею, что в этом плохого.

Любая помощь была бы очень признательна.

Заранее спасибо.

Ответ №1:

Вы не должны добавлять элементы в список, но расширяйте список всеми элементами в QuerySet , так что:

 for excluding in block_or_not:
    exclude_this = excluding.blocked_tags.all()
    exclude_this_list  = exclude_this

posts = Post.objects.filter(date_added__lte=now).exclude(
    tags__in=exclude_this_list
) 

Однако вы, вероятно, можете исключить их с помощью одного оператора exclude:

 posts = Post.objects.filter(date_added__lte=now).exclude(
    tags__addfav__favorite_users=request.user
) 

это исключит a Post , если есть тег, для которого есть AddFav объект, имеющий значение request.user as (один из) favorite_users .

Комментарии:

1. Сэр, Какой метод будет быстрым ? Первый или второй ?

2. @refri: второй сделает только один запрос, поэтому он, вероятно, более эффективен.

Ответ №2:

Проблема заключается в этом фрагменте кода:

 for excluding in block_or_not:
    exclude_this = excluding.blocked_tags.all()
    exclude_this_list.append(exclude_this)
 

.all() вернет набор запросов, а затем мы добавим этот набор запросов в другой список. Итак, в конце exclude_this_list приведен список наборов запросов, который нам не нужен.

Вместо добавления набора запросов мы можем собрать все заблокированные идентификаторы тегов и использовать extend их, потому что нам нужен сглаженный список.

 for excluding in block_or_not:
    exclude_this = list(excluding.blocked_tags.values_list('id', flat=True))
    exclude_this_list.extend(exclude_this)