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 Rest Framework - Fatal编程技术网

Python 从外键获取用户对象

Python 从外键获取用户对象,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在使用Django Rest框架。我有两种型号,如下所示: 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.CAS

我正在使用Django Rest框架。我有两种型号,如下所示:

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)
我希望有一个API,它将返回用户拥有的所有追随者。但是,我不希望它以
以下
模型格式返回,我希望追随者以此格式作为用户返回:

[
 {
     "username": Bob,
     "email": example@example.com
 },
 {
     "username": Charlie,
     "email": example@example.com
 }
]
现在,我有这样的想法:

class FollowingAPIView(ListAPIView):
    serializer_class = FollowingSerializer

    def get_queryset(self):
        return Following.objects.filter(target=3)

class FollowingSerializer(serializers.ModelSerializer):

    class Meta:
        model = Following
        fields = ('follower', 'target')
path('/api/followers/<username>/', FollowingAPIView.as_view(), name='get_user_followers')

这只显示
跟随者
目标
我不想要这个。我需要来自
用户的实际数据
另外,我将
target=3
作为占位符,以进行测试

您应该为
用户使用序列化程序,而不是
以下的

class UserSerializer(serializers.ModelSerializer):
    is_following = serializer.IntegerField()
    class Meta:
        model = User
        fields = ('username', 'email', 'is_following')
另外,在视图中更改查询集,如下所示:

from django.db import models
from rest_framework.generics import get_object_or_404

class FollowingAPIView(ListAPIView):
    serializer_class = FollowingSerializer

    ### so add this method to get the requested user based on the username in the url
    def get_requested_user(self):
        ##get the user based on the user name in url
        filter_kwargs = {'username': self.kwargs['username']} 
        obj = get_object_or_404(User.objects.all(), **filter_kwargs)
        return obj

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

如果您使用的是Django,您应该为
用户使用序列化程序,而不是
以下的

class UserSerializer(serializers.ModelSerializer):
    is_following = serializer.IntegerField()
    class Meta:
        model = User
        fields = ('username', 'email', 'is_following')
另外,在视图中更改查询集,如下所示:

from django.db import models
from rest_framework.generics import get_object_or_404

class FollowingAPIView(ListAPIView):
    serializer_class = FollowingSerializer

    ### so add this method to get the requested user based on the username in the url
    def get_requested_user(self):
        ##get the user based on the user name in url
        filter_kwargs = {'username': self.kwargs['username']} 
        obj = get_object_or_404(User.objects.all(), **filter_kwargs)
        return obj

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

如果您使用的是Django,那么这应该是您的完整输出吗?在这种情况下,您似乎应该在用户模型上使用序列化程序,而不是在下面的模型上使用序列化程序;您可以在
get\u queryset
方法中将用户限制为遵循目标的用户。@DanielRoseman嗯,我在将序列化程序更改为用户模型时出错。它说它没有名为
username
的属性,这应该是您的完整输出吗?在这种情况下,您似乎应该在用户模型上使用序列化程序,而不是在下面的模型上使用序列化程序;您可以在
get\u queryset
方法中将用户限制为遵循目标的用户。@DanielRoseman嗯,我在将序列化程序更改为用户模型时出错。它说它没有名为
username
的属性,这很好用!有没有办法添加一个额外的字段作为输出JSON响应?例如,我想知道目标用户是否跟随该追随者。因此,输出可能类似于
[{“username”:Bob,“email”:e@example.com,is_following:1}]
1表示目标确实跟随用户,0表示目标没有跟随用户是的,我想你可以使用annotate,我会更新我的答案。嗯,对于
模型
它说这是一个未解决的引用从django.db import models导入
,这就像一个魅力!最后一个问题,如果你能回答的话,我想过滤不是基于登录用户,而是基于url中的内容。例如,
/api/followers/bob
将返回bob的所有追随者
/api/followers/charlie
将返回charlie的所有追随者这太棒了!有没有办法添加一个额外的字段作为输出JSON响应?例如,我想知道目标用户是否跟随该追随者。因此,输出可能类似于
[{“username”:Bob,“email”:e@example.com,is_following:1}]
1表示目标确实跟随用户,0表示目标没有跟随用户是的,我想你可以使用annotate,我会更新我的答案。嗯,对于
模型
它说这是一个未解决的引用从django.db import models导入
,这就像一个魅力!最后一个问题,如果你能回答的话,我想过滤不是基于登录用户,而是基于url中的内容。例如,
/api/followers/bob
将返回bob的所有追随者
/api/followers/charlie
将返回charlie的所有追随者