通过模型使用多对多领域实施关注者系统

时间:2019-12-16 00:47:03

标签: python django django-rest-framework

我正在添加关注/关注者系统,并且在我的个人资料模型中将其设为异物。问题是,我希望能够像在特定用户开始关注时一样保存多个信息,并在将来保存其他信息,因此我通过模型使多对多字段通过,如下所示:{{3} }

请,我想知道我在得到的东西中缺少了

AttributeError at /api/opeyemi-odedeyi-ikx5yh/follow/
'User' object has no attribute 'following'

我已经尝试过了:

models.py

class Profile(models.Model):
    SEX= (
    ('M', 'Male'),
    ('F', 'Female'),
    )

    user          = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profiles')
    date_of_birth = models.DateField(blank=True, verbose_name="DOB", null=True)
    bio           = models.TextField(max_length=500, blank=True, null=True)
    sex           = models.CharField(max_length=1, choices=SEX, blank=True, null=True)
    following     = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, through='Follow', related_name='followed_by')
    updated_on    = models.DateTimeField(auto_now=True)


    def __str__(self):
        return self.user.fullname

class Follow(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='user_following')
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='profile')
    date_followed = models.DateField(auto_now_add=True)

serializers.py

class ProfileDetailedSerializer(serializers.ModelSerializer):
    user = serializers.SlugRelatedField(read_only=True, slug_field='slug')
    age = serializers.SerializerMethodField(read_only=True)

    following = serializers.SlugRelatedField(read_only=True, slug_field='slug', many=True)
    following_count = serializers.SerializerMethodField(read_only=True)
    user_has_followed = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Profile
        fields = "__all__"

        read_only_fields = ('pk', 'user')

    def get_age(self, instance):
        today = date.today()
        dob = instance.date_of_birth
        if dob==None:
            return None
        return today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day))

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

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

views.py

class UserFollowAPIView(APIView):
    '''
    Can follow(post) and unfollow(delete) the user
    '''
    serializer_class = ProfileDetailedSerializer
    permission_classes = [IsAuthenticated]

    def delete(self, request, slug):
        followUser = get_object_or_404(User, slug=slug)
        user = self.request.user

        followUser.following.remove(user)
        followUser.save()

        serializer_context = {"request": request}
        serializer = self.serializer_class(followUser, context=serializer_context)

        return Response(serializer.data, status=status.HTTP_200_OK)

    def post(self, request, slug):
        followUser = get_object_or_404(User, slug=slug)
        user = self.request.user

        followUser.following.add(user)
        followUser.save()

        serializer_context = {"request": request}
        serializer = self.serializer_class(followUser, context=serializer_context)

        return Response(serializer.data, status=status.HTTP_200_OK)

urls.py

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

注意:

我使用slug是因为我没有在应用程序中使用用户名,所以我有一个slug字段并将其设置为查找字段,而不是普通pk

serializer_context是这样,以便用户在返回true时无法跟随(即,他们不能跟随两次)

0 个答案:

没有答案
相关问题