字段'id'期望一个数字,但得到<taggit.managers_TagtableManager对



我正在构建一个BlogApp,我遇到了一个错误。

我想做的事情:-(我想让它做的事情)

我正在筛选具有类似tags的用户。但是当我尝试过滤时,错误不断显示-

字段"id"应为数字,但得到<taggit.managers_TagtableManager对象位于0x0000015B266D3288>。

models.py

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE,default='',unique=True)
interests = TaggableManager(verbose_name='interests')

views.py

def test_hobbiesss(request,user_id):
users = Profile.objects.filter(interests=request.user.profile.interests)
context = {'users':users}
return render(request, 'list.html', context)

我试过什么:-

  • 我也试过
users = Profile.objects.filter(interests=request.user.profile.interests.all())

但它显示了这个错误

使用切片,精确查找的QuerySet值必须限制为一个结果。

如有任何帮助,我们将不胜感激。

提前谢谢。

users = Profile.objects.filter(interests=request.user.profile.interests.all())

此操作失败,错误为:

使用切片,精确查找的QuerySet值必须限制为一个结果。

因为,您直接在interests中搜索,这是一个精确的查找。因为,用户的兴趣可能是多个,所以您需要__in查找:

users = Profile.objects.filter(interests__in=request.user.profile.interests.all())

请注意,这也将获得request.user的配置文件,因此如果需要排除,可以附加.exclude(user=request.user)

如果user_1设置了两个兴趣,则此代码将向用户显示其中一个标签是否与其他用户相似,但我试图显示如果有两个以上的标签相似,则向用户显示。

在这种情况下,您可以对兴趣使用annotate并使用filter:

users = (
Profile.objects.filter(
interests__in=request.user.profile.interests.all(),
).annotate(
interests_cnt=Count('interests'),
).filter(
interests_cnt__gt=1,
)
)

相关内容

最新更新