Как сделать систему следования за последователем с моделью Джанго - PullRequest
2 голосов
/ 11 ноября 2019

Я студент, изучающий фреймворк отдыха django

Я делаю простой sns с фреймворком отдыха django

Мне нужна система следования за последователем. Итак, я попытался сделать это, но есть некоторая проблема

Кулак, это моя пользовательская модель с 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)

полевые последователи - это люди, которые следуют за мной, а следующие - это те, кого яfollow

Когда я добавляю подписку с этим классом 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Следующее поле и добавьте user_id в поле подписчиков

Но это не работает

То, что я хочу для результата, выглядит следующим образом (с пользовательским интерфейсом API)

{
        "followers": [],
        "following": [
            "some user"
        ],
}

someинформация о пользователе

{
        "followers": [
            "user above"
        ],
        "following": [
        ],
}

Но реальный результат такой:

{      
        "followers": [
            "some user"
        ],
        "following": [
            "some user"
        ],
}

Информация о каком-то пользователе

{
        "followers": [
            "user above"
        ],
        "following": [
            "user above"
        ],
}

это не то, что я хочу

Понятия не имею с этой проблемой, мне нужна помощь

Спасибо

1 Ответ

1 голос
/ 11 ноября 2019

Я бы разработал его по-другому.

Я бы не добавил информацию в модель User, но явно создал бы другую таблицу для хранения информации о «подписчиках» и «подписках».

Схема таблицы будет выглядеть следующим образом:

class UserFollowing(models.Model):
    user_id = models.ForeignKey("User", related_name="following", null=False,blank=False)

    following_user_id = models.ForeignKey("User", related_name="followers", null=False,blank=False)

    # 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...