使用 get_object_or_404 只获取一个字段而不是 django Rest 框架中模型中指定的所有字段?

Abd*_*mer 0 django serialization django-models django-views django-rest-framework

我试图从 get_object_or_404 中获取一个字段,但它似乎对我不起作用。

我正在使用 django 的默认身份验证应用程序中的用户模型。这是我的序列化器:

class UserSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=150)
    email = serializers.EmailField(max_length=254)
    first_name = serializers.CharField(max_length=30)
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

class UserView(APIView):

    def get(self, request, id=None):

        if id:
               data = 
               get_object_or_404(User.objects.only('username'), 
               id=id)
            serializer = UserSerializer(data, many=False)
            return Response(serializer.data)
        else:
                data = get_list_or_404(User)
            serializer = UserSerializer(data, many=True)
            return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

即使在使用这个之后,get_object_or_404(User.objects.only('username'), id=id)我仍然得到序列化器中指定的所有字段,而不仅仅是用户名。

这是当我从邮递员调用它时将 id 传递给 api 时得到的响应。

{
    "username": "admin",
    "email": "admin@email.com",
    "first_name": ""
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

{
    "username": "admin",
}
Run Code Online (Sandbox Code Playgroud)

JPG*_*JPG 5

来自文档 get_object_or_404

\n\n
\n

调用get()给定的模型管理器,但它引发Http404而不是 model\xe2\x80\x99sDoesNotExist异常。

\n
\n\n

您不需要期望它只返回一个值。

\n\n
\n\n

解决方案

\n\n

username从序列化器中删除除 之外的其他字段

\n\n
class UserSerializer(serializers.Serializer):\n    username = serializers.CharField(max_length=150)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

更通用的解决方案是,使用两个不同的序列化器来实现这两个目的

\n\n
# serializers.py\nclass UserListSerializer(serializers.Serializer):\n    username = serializers.CharField(max_length=150)\n    email = serializers.EmailField(max_length=254)\n    first_name = serializers.CharField(max_length=30)\n\n\nclass UserGetSerializer(serializers.Serializer):\n    username = serializers.CharField(max_length=150)\n\n\n# views.py\nclass UserView(APIView):\n\n    def get(self, request, id=None):\n        if id:\n            user_instance = get_object_or_404(User, id=id)\n            serializer = UserGetSerializer(user_instance)  # used `UserGetSerializer`\n            return Response(serializer.data)\n        else:\n            user_qs = get_list_or_404(User)\n            serializer = UserListSerializer(user_qs, many=True)  # used `UserListSerializer`\n            return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)\n\n

这里我创建了两个序列化器类,UserListSerializerUserGetSerializer在视图中使用它们。

\n