django - 如何使用 django 模型制作追随者系统
问题描述
我是学习django rest框架的学生
我正在用 django rest 框架制作一个简单的 sns
我需要追随者系统。所以,我试着做到了,但有一些麻烦
首先这是我的带有 AbstractBaseUser 和 PermissionsMixin 的用户模型
class User(AbstractBaseUser, PermissionsMixin):
user_id = models.CharField(max_length=100, unique=True, primary_key=True)
name = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
is_staff = models.BooleanField(default=False)
followers = models.ManyToManyField('self', related_name='follower',blank=True)
following = models.ManyToManyField('self', related_name='following',blank=True)
profile_image = models.ImageField(blank=True)
现场追随者是追随我的人,追随是我追随的人
当我使用此 APIView 类添加以下内容时
class AddFollower(APIView):
permission_classes = [IsAuthenticated, ]
def post(self, requset, format=None):
user = User.objects.get(user_id=self.request.data.get('user_id'))
follow = User.objects.get(user_id=self.request.data.get('follow'))
user.following.add(follow)
user.save()
follow.followers.add(user)
follow.save()
print(str(user) + ", " + str(follow))
return JsonResponse({'status':status.HTTP_200_OK, 'data':"", 'message':"follow"+str(follow.user_id)})
user_id 是我,follow 是我想关注的人
我想将关注添加到 user_id 的关注字段并将 user_id 添加到关注的关注字段
但它不起作用
我想要的结果是这样的(带有用户信息api)
{
"followers": [],
"following": [
"some user"
],
}
一些用户的用户信息
{
"followers": [
"user above"
],
"following": [
],
}
但真正的结果是这样的
{
"followers": [
"some user"
],
"following": [
"some user"
],
}
一些用户的用户信息
{
"followers": [
"user above"
],
"following": [
"user above"
],
}
这不是我想要的
我不知道这个问题我需要一些帮助
谢谢
解决方案
我会以不同的方式设计它。
我不会将信息添加到User
模型中,而是显式创建另一个表来存储有关“关注者”和“关注者”的信息。
表的架构将是:
class UserFollowing(models.Model):
user_id = models.ForeignKey("User", related_name="following")
following_user_id = models.ForeignKey("User", related_name="followers")
# You can even add info about when user started following
created = models.DateTimeField(auto_now_add=True)
现在,在您的 post 方法实现中,您只需执行以下操作:
UserFollowing.objects.create(user_id=user.id,
following_user_id=follow.id)
然后,您可以轻松访问关注者和关注者:
user = User.objects.get(id=1) # it is just example with id 1
user.following.all()
user.followers.all()
然后您可以创建约束,这样用户就不能两次关注同一个用户。但我把这个留给你(提示:unique_together)
推荐阅读
- reactjs - 如何使用状态更新对象数组中的多个项目?
- oracle - Oracle SQL 假脱机
- django - 通过表单添加多个实例
- oauth-2.0 - 无法使用“httr”接收 Deezer 的有效访问令牌
- google-sheets - 如何用谷歌电子表格中的文字描述替换表情符号?
- javascript - 如何在 chrome 扩展中使用 Google 分析跟踪事件?
- python - 根据输入创建表,如果db文件中不存在输入,则创建表,如果存在,则将ID写入其中
- oracle-sqldeveloper - 获取 ORACLE SQL 开发人员中单个员工的总出勤率
- python - 查找最接近的元素值(最小值和最大值)以及差异百分比
- gradle - 在从包含三个 .gradle 文件的存储库创建自定义 gradle 插件时需要帮助