首页 > 解决方案 > 实施追随者和追随者无法正常工作

问题描述

我有一个用户模型,它有一个用于查找的 slug 字段。我正在尝试在我的 rest API 中将用户关注和关注者作为自己的模型来实现,因此我可以保存有关关注者和关注者的更多信息,并且由于我正在尝试构建一个大项目,因此我认为这是一个更好的做法。

问题是代码不起作用,并且用户在尝试关注时没有关注用户。

如果用户,我希望能够关注用户,而用户无法关注自己并关注一次

模型.py

class UserFollowing(models.Model):
    following = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="follows", null=False, blank=False, on_delete=models.DO_NOTHING)
    followers = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="followed_by", null=False, blank=False, on_delete=models.DO_NOTHING)
    followed_on = models.DateTimeField(auto_now_add=True)

序列化程序.py

class UserFollowingSerializer(serializers.ModelSerializer):
    following_count = serializers.SerializerMethodField(read_only=True)
    followers_count = serializers.SerializerMethodField(read_only=True)
    user_is_following = serializers.SerializerMethodField(read_only=True)
    followed_on = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = UserFollowing
        fields = "__all__"

    def get_followed_on(self, instance):
        return instance.followed_on.strftime("%d %B, %Y")

    def get_following_count(self, instance):
        return instance.following.count()

    def get_followers_count(self, instance):
        return instance.followers.count()

    def get_user_is_following(self, instance):
        request = self.context.get("request")
        return instance.following.filter(slug=request.user.slug).exists()

视图.py

class UserFollowAPIView(APIView):
    serializer_class = UserFollowingSerializer
    permission_classes = [IsAuthenticated]

    def delete(self, request, pk):
        user = get_user_model().objects.get("slug")
        UserFollowing.objects.delete(user_id=user, following_user_id=user)

    def post(self, request, pk):
        user = get_user_model().objects.get("slug")
        UserFollowing.objects.create(user_id=user, following_user_id=user)

网址.py

path("<slug:slug>/follow/", UserFollowAPIView.as_view(), name="users-follow"),

非常感谢

标签: pythondjangodjango-rest-framework

解决方案


模型.py

class UserFollowing(models.Model):                            
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    following = models.ManyToMany(settings.AUTH_USER_MODEL, related_name="follows",null=False, blank=False, on_delete=models.DO_NOTHING)
    followers = models.ManyToMany(settings.AUTH_USER_MODEL, related_name="followed_by",null=False, blank=False, on_delete=models.DO_NOTHING)
    followed_on = models.DateTimeField(auto_now_add=True)

序列化程序.py

class UserFollowingSerializer(serializers.ModelSerializer):
    following_count = serializers.SerializerMethodField(read_only=True)
    followers_count = serializers.SerializerMethodField(read_only=True)
    user_is_following = serializers.SerializerMethodField(read_only=True)
    followed_on = serializers.SerializerMethodField(read_only=True)

class Meta:
    model = UserFollowing
    fields = "__all__"

def get_followed_on(self, instance):
    return instance.followed_on.strftime("%d %B, %Y")

def get_following_count(self, instance):
    return instance.following.count()

def get_followers_count(self, instance):
    return instance.followers.count()

def get_user_is_following(self, instance):
    request = self.context.get("request")
    return instance.following.filter(slug=request.user.slug).exists()

视图.py

class UserFollowAPIView(APIView):
    serializer_class = UserFollowingSerializer
    permission_classes = [IsAuthenticated]

def delete(self, request, pk):
    user = get_user_model().objects.get("slug")
    user.objects.delete(user_id=user, following_user_id=user)

def post(self, request, pk):
    user = UserFollowing.objects.get(user=request.user)  #this is the user that wants to follow someone
    who_to_follow = UserFollowing.objects.get('slug')  #i hope the slug is the user to be followed thoo ..user being followed
    user.followers.add(who_to_follow)

网址.py

path("<slug:slug>/follow/", UserFollowAPIView.as_view(), name="users-follow"),

我还没有测试过这段代码.....所以它只是直觉......但它应该可以工作


推荐阅读