Python 从外键获取用户对象
我正在使用Django Rest框架。我有两种型号,如下所示: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
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的所有追随者