字段 'id' 需要一个数字,但得到 [<django.db.models.sql.query.Query 对象在 0x000002CFD4506EC8>]

时间:2021-07-07 10:07:51

标签: python django django-models django-views

我正在构建一个博客应用程序,我正在尝试排除具有另一个模型字段的帖子。 但是当我去浏览器时,这个错误一直显示

<块引用>

字段 '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)

我不知道这有什么问题。

任何帮助将不胜感激。

提前致谢。

2 个答案:

答案 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