我正在构建一个博客应用程序,我正在尝试排除具有另一个模型字段的帖子。 但是当我去浏览器时,这个错误一直显示
<块引用>字段 'id' 需要一个数字,但得到 [
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)
我不知道这有什么问题。
任何帮助将不胜感激。
提前致谢。
答案 0 :(得分:0)
问题出在这段代码中:
for excluding in block_or_not:
exclude_this = excluding.blocked_tags.all()
exclude_this_list.append(exclude_this)
.all()
将返回一个查询集,然后我们将该查询集附加到另一个列表中。所以最后,exclude_this_list
是一个查询集列表,这不是我们想要的。
我们可以收集所有被阻止的标签 ID 并使用 extend
,而不是附加查询集,因为我们需要一个扁平化的列表。
for excluding in block_or_not:
exclude_this = list(excluding.blocked_tags.values_list('id', flat=True))
exclude_this_list.extend(exclude_this)
答案 1 :(得分:0)
您不应该将项目追加到列表中,而是扩展包含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
)
如果存在一个 Post
对象的标签,该对象将 AddFav
作为(其中一个)request.user
,则这将排除 favorite_users
。>