Django中如何通过用户ID查询UserProfile内存储的关注用户列表
问题原因
你原来的查询逻辑完全搞反了:UserProfile.objects.filter(favorites__user__id=user_id) 实际是筛选「自身关注列表里包含id为user_id的用户对应的profile」的所有UserProfile,也就是你查出来的是该用户的粉丝列表,不是你要的关注列表,自然结果不符合预期。
正确写法
写法1(更简洁易读,推荐)
先拿到对应用户的UserProfile实例,直接取关联的关注列表即可:
# 先根据用户ID获取对应的profile,可根据需求用get_object_or_404处理不存在的情况 target_profile = UserProfile.objects.get(user__id=user_id) # 直接取关注列表 favorites = target_profile.favorites.all()
写法2(单条QuerySet查询)
如果不想分两次查询,可以利用多对多字段的默认反向关联实现:
favorites = UserProfile.objects.filter(userprofile__user__id=user_id)
可读性优化建议
你可以给多对多字段加上related_name,不用记默认反向关联名,代码可读性更高,修改UserProfile模型如下:
class UserProfile(models.Model): birth_date = models.DateField(default=datetime.date(1900, 1, 1)) # related_name对应反向关联:所有关注我的用户profile favorites = models.ManyToManyField('self', symmetrical=False, related_name='followed_by')
修改后单条查询可以写成更易懂的形式:
favorites = UserProfile.objects.filter(followed_by__user__id=user_id)
内容的提问来源于stack exchange,提问作者lionel
相关产品推荐
相关产品推荐

