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