Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查是否存在与查询的关系_Python_Django_Django Models_Django Rest Framework - Fatal编程技术网

Python 检查是否存在与查询的关系

Python 检查是否存在与查询的关系,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,我试图使用查询检查是否存在以下关系。首先,我获取用户拥有的所有追随者,然后检查用户是否追随这些追随者。以下是我的模型: class Following(models.Model): target = models.ForeignKey('User', related_name='followers', on_delete=models.CASCADE, null=True) follower = models.ForeignKey('User', related_name='ta

我试图使用查询检查是否存在以下关系。首先,我获取用户拥有的所有追随者,然后检查用户是否追随这些追随者。以下是我的模型:

class Following(models.Model):
    target = models.ForeignKey('User', related_name='followers', on_delete=models.CASCADE, null=True)
    follower = models.ForeignKey('User', related_name='targets', on_delete=models.CASCADE, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '{} is followed by {}'.format(self.target, self.follower)

class User(AbstractBaseUser):
    username    = models.CharField(max_length=15, unique=True)

    email       = models.EmailField(max_length=100, unique=True)
我使用的是Django Rest框架,因此我转到特定的URL以获取所需的信息。转到URL后,预期会有输出。我得到了用户拥有的所有追随者

视图.py

class GetFollowersView(ListAPIView):
    serializer_class = FollowingSerializer

    def get_queryset(self):
        requested_user = get_requested_user(self)
        return User.objects.filter(targets__target=requested_user).order_by('-targets__created_at'). \
            annotate(is_following=Count('followers__follower', filter=Q(followers__follower=requested_user), distinct=True))

def get_requested_user(self):
    filter_kwargs = {'username': self.kwargs['username']}
    return get_object_or_404(User.objects.all(), **filter_kwargs)
class FollowingSerializer(serializers.ModelSerializer):
    is_following = serializers.IntegerField()
    class Meta:
        model = User
        fields = ('id', 'username', 'follower_count', 'following_count', 'is_following')
序列化程序.py

class GetFollowersView(ListAPIView):
    serializer_class = FollowingSerializer

    def get_queryset(self):
        requested_user = get_requested_user(self)
        return User.objects.filter(targets__target=requested_user).order_by('-targets__created_at'). \
            annotate(is_following=Count('followers__follower', filter=Q(followers__follower=requested_user), distinct=True))

def get_requested_user(self):
    filter_kwargs = {'username': self.kwargs['username']}
    return get_object_or_404(User.objects.all(), **filter_kwargs)
class FollowingSerializer(serializers.ModelSerializer):
    is_following = serializers.IntegerField()
    class Meta:
        model = User
        fields = ('id', 'username', 'follower_count', 'following_count', 'is_following')

但是,问题出在
注释后面的
中。我想看看用户是否跟随每个特定的追随者。如果它们跟随该跟随者,则
是跟随者
应为1如果不是,则为0。我在
is\u following
中得到了不正确的结果。有没有办法检查用户是否遵循了每个特定的跟随者?

如果您安装了Django Debug工具栏,并且您检查了当前过滤器/注释的查询,这就是它显示的内容(对于单个用户)

然而,要获得所选用户所遵循的用户数,您确实需要这样的东西

SELECT ue."id", ue."username", ue."email", COUNT(DISTINCT fe."target_id") AS 
"is_following" FROM "user" u inner JOIN "following" fe ON ( u."id" = 
fe."follower_id" ) inner join user ue on fe.target_id = ue.id and u.id = 4
GROUP BY ue."id", ue."username", ue."email"
我认为不可能像你所做的那样在同一个查询中同时合并追随者和追随者。你可能会找到十字路口,然后从那里继续……像这样的

    def get_queryset(self):
        username = self.request.query_params.get('username', None)
        requested_user = models.User.objects.get(username=username)
        following_me = models.User.objects.filter(targets__target=requested_user).order_by('-targets__created_at')
        i_follow = models.User.objects.filter(followers__follower=requested_user).order_by('-followers__created_at')
        common = following_me & i_follow
        ### Set is_following for common as 1, all others as 0.
        #......
        #......
        return following_me

为什么不使用M2M关系?这似乎很简单:

from django.db import models


class User(models.Model):
    name = models.CharField(max_length=200)
    followers = models.ManyToManyField('User')

    @property
    def follower_count(self):
        # How many people follow me
        return len(self.followers)

    @property
    def followee_count(self):
        # How many people I follow
        return len(self.user_set.all())
您可以修改
get\u queryset()
以仅查找追随者:

User.objects.filter(followers__contains=self.request.user)

这有帮助吗?

您所说的“我得到的结果不正确”是什么意思?注释时你得到的结果是什么?@JPG我得到的结果基本上是用户遵循的所有用户的总和。例如,假设用户是Bob。Bob的所有追随者都将被显示,在每个跟随者中都会有Bob跟随的用户总数,而不是Bob是否跟随特定的人。例如,Bob没有跟随John返回,因此应该有0而不是1,因为Bob跟随Jessica返回。你也可以发布你的序列化程序和整个视图代码吗?@Angela刚刚用这些细节更新了问题Jango提供了
请求。user
以获取当前登录的用户。你为什么不使用这个功能呢?