Возврат сообщений людей, за которыми следует пользователь - PullRequest
0 голосов
/ 21 января 2020

У меня есть пользователь, следующий за системой, я хочу иметь возможность получать все сообщения / витрины людей, за которыми следует пользователь. Я смог реализовать это до такой степени.
ПРОБЛЕМА заключается в том, что вместо получения сообщений всех пользователей, следующих за ним, вместо этого он возвращает только сообщения одного пользователя и не возвращает все сообщения пользователя, за которыми следует человек.

с учетом models.py - модели пользователя, подписки и showcse (сообщения пользователя)

class User(AbstractBaseUser, PermissionsMixin):
    username = None
    email = models.EmailField(max_length=254, unique=True)
    fullname = models.CharField(max_length=250)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=255, unique=True, blank=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['fullname']

class FollowLog(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='followers')
    followed_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
                                    related_name='following', null=True)
    followed_on = models.DateTimeField(auto_now_add=True)
    status = models.CharField(choices=FOLLOW_STATUS, default=FollowStatus.following.value, max_length=30)
    updated_on = models.DateTimeField(auto_now=True)
    unfollowed_on = models.DateTimeField(null=True)
    blocked_on = models.DateTimeField(null=True)

class Showcase(models.Model):
    title = models.CharField(max_length=50)
    description = models.TextField(null=True)
    skill_type = models.ForeignKey(Skill, on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="Showcases")
    content = models.TextField(null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    voters = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="upvotes")
    slug = models.SlugField(max_length=255, unique=True)

views.py , чтобы получить все сообщения пользователей, за которыми следует авторизоваться

class FollowerShowcasesView(generics.ListAPIView):
    serializer_class = ShowcaseSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        current_user = self.request.user
        followed_people = FollowLog.objects.filter(user=current_user).filter(status='following').values('followed_by')
        return Showcase.objects.filter(user__in=followed_people).order_by('-created_on')

serializers.py

class ShowcaseDetaiedSerializer(serializers.ModelSerializer):
    user = serializers.SlugRelatedField(read_only=True, slug_field='slug')
    *some other things*

    class Meta:
        model = Showcase
        exclude = ['updated_on', 'id']

Проблема заключается в том, что текущий зарегистрирован пользователь подписан на 2 пользователей

[
    {
        "user": "opeyemi-david-odedeyi-7ug3j0"
    },
    {
        "user": "opeyemi-odedeyi-spniw5"
    }
]

когда я пытаюсь получить сообщения пользователя, за которым следует вошедший в систему пользователь, я получаю только для первого пользователя "opeyemi-david-odedeyi-7ug3j0"

[
    {
        "user": "opeyemi-david-odedeyi-7ug3j0",
        "created_on": "1 day ago",
        "likes_count": 0,
        "user_has_voted": false,
        "slug": "love-over-everything-27l1ol",
        "comment_count": 0,
        "title": "Love over everything",
        "description": "dsunfdlujnfiundlijndijnfdkjndfkjndfkjnfdjndfjunfdju",
        "content": "jsdkjnsdkjndkhjnsdndskdsndsnsdjnkdsndskjndsjdsd",
        "skill_type": 2
    },
    {
        "user": "opeyemi-david-odedeyi-7ug3j0",
        "created_on": "1 month ago",
        "likes_count": 1,
        "user_has_voted": true,
        "slug": "lorem-ipsum-4ib02y",
        "comment_count": 1,
        "title": "lorem ipsum",
        "description": "lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsum",
        "content": "lorem ipsumlorem ipsumlorem ipsumlorem ipsum",
        "skill_type": 1
    }
]

проблема в том, что у второго пользователя также есть записи / витрины

[
    {
        "user": "opeyemi-odedeyi-spniw5",
        "created_on": "8 hours ago",
        "likes_count": 0,
        "user_has_voted": false,
        "slug": "consistency-s1v63n",
        "comment_count": 0,
        "title": "Consistency",
        "description": "consistence is the key to success",
        "content": "h,jhbjhbjhbjhbjh",
        "skill_type": 1
    }
]

пожалуйста, у кого-нибудь есть идея, почему он не возвращает витрины всех людей, за которыми он следует?

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Я думаю, что вы можете достичь своей цели, если вы измените представление следующим образом:

followed_people = FollowLog.objects.filter(followed_by=current_user).filter(status='following').values('followed_by')
    return Showcase.objects.filter(user__in=followed_people).order_by('-created_on')
0 голосов
/ 21 января 2020
followed_people = FollowLog.objects.filter(followed_by=current_user).filter(status='following').values('user')

@ У Мухаммеда была идея qight, код выше решил проблему для меня

...