在DRF中查询和过滤相关模型

时间:2020-10-04 11:56:49

标签: django django-rest-framework

我有Contact模型来列出User对象的关注者,我尝试过滤User的联系人,但仍然无法获得正确的{{1} }。我的queryset模型很简单,只有两个Contact

ForeignKey

我为class Contact(models.Model): user_from = models.ForeignKey(User,related_name='rel_from_set', on_delete=models.CASCADE,) user_to = models.ForeignKey(User,related_name='rel_to_set', on_delete=models.CASCADE,) def __str__(self): return '{} follow {}'.format(self.user_from, self.user_to) User创建了序列化器:

Contact

并尝试通过视图进行查询:

##Contact Serializer
class ContactsSerializer(serializers.ModelSerializer):
    user_from = serializers.StringRelatedField(read_only=True)
    user_to = serializers.StringRelatedField(read_only=True)
    class Meta:
        model = Contact
        fields = ["user_from", "user_to"]
##UserSerializer
class UserInformationSerializer(serializers.ModelSerializer):
    followers = ContactsSerializer(many=True, read_only=True)
 
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'followers']

现在我收到错误消息:

class FollowerListView(APIView):
    queryset = Contact.objects.all()
    serializer_class = ContactsSerializer
    lookup_field = "username"
    
    def get(self, request, format=None, slug=None):
        kwarg_username = self.kwargs.get("slug")
        user = User.objects.filter(is_active=1).filter(username=kwarg_username)
        print(user.username)
        contacts = Contact.objects.filter(user_to=user.id)
        serializer = ContactsSerializer(contacts)
        return Response(serializer.data)

如果我尝试AttributeError at /api/member/ytsejam/followers/ 'QuerySet' object has no attribute 'username' print(user.username) ,则可以看到用户print(user)。 你可以指导我如何纠正吗?

谢谢

1 个答案:

答案 0 :(得分:1)

filter将始终返回查询集。如果您希望检索单个项目,请使用get

看起来像这样:

def get(self, request, format=None, slug=None):
        kwarg_username = self.kwargs.get("slug")
        user = User.objects.filter(is_active=1).get(username=kwarg_username)
        print(user.username)
        contacts = Contact.objects.filter(user_to=user.id)
        serializer = ContactsSerializer(contacts)
        return Response(serializer.data)

您当然可以一口气做到这一点:

User.objects.get(is_active=1, username=kwarg_username)

但是请注意,如果您的模型中有两行可以满足此调用,则Django将抛出错误。最好确保username具有unique约束。