Django获取用户创建的对象,这些用户属于一个用户列表

r3i60tvu  于 2023-01-10  发布在  Go
关注(0)|答案(2)|浏览(124)

我有一个追随者的模型。这个模型是这样的:

class Follow(models.Model):
    followee = models.ForeignKey(User, on_delete=models.CASCADE, related_name="followee")

    follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name="follower")

    created_at = models.DateTimeField(auto_now_add=True, verbose_name="created at")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="updated at")

    class Meta:
        unique_together = ["followee", "follower"]

    def __str__(self):
        return "{} is following {}".format(self.follower, self.followee)

    def save(self, *args, **kwargs):
        if self.followee == self.follower:
            return "You cannot follow yourself"
        else:
            super().save(*args, **kwargs)

用户创建多种类型的对象,如帖子和问题。我希望显示关注特定用户的所有用户的所有帖子和问题。简化显示关注我的用户的所有帖子和问题。
我正在使用一个名为drf_multiple_model的模块,这是我的视图,我无法使用它。它给了我下面的错误,我不明白:

Cannot use QuerySet for "Follow": Use a QuerySet for "User".

下面是我使用的视图:

def get_followers(queryset, request, *args, **kwargs):
    id = kwargs['user']
    user = User.objects.get(id=id)
    followers = Follow.objects.all().filter(followee=user)
    return queryset.filter(user__in=followers)

class HomeView(FlatMultipleModelAPIView):
    permission_classes = [IsAuthenticated]

    def get_querylist(self):

        querylist = [ 
            {'queryset':Post.objects.all(), 'serializer_class': UserPostSerializer, 'filter_fn': get_followers, 'label':'post'},
            {'queryset':Question.objects.all(), 'serializer_class': QuestionSerializer, 'filter_fn': get_followers, 'label':'question'},
        ]
        return querylist

请问我做错了什么?

ztmd8pv5

ztmd8pv51#

为了能够使用__in过滤器,followers应该是User s的可迭代对象。

followers = [f.follower for f in Follow.objects.filter(followee=user)]

followers = [f.follower for f in user.follower.all()]
h43kikqp

h43kikqp2#

您可以使用JOIN进行筛选,例如:

def get_followers(queryset, request, *args, **kwargs):
    return queryset.filter(user__follower__followee_id=kwargs['user'])

这将在单个查询中获取项目,从而避免先查询关注者然后再获取项目。

相关问题