我正在构建一个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,
)
)