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)
来自文档 get_object_or_404
\n\n\n调用
\nget()给定的模型管理器,但它引发Http404而不是 model\xe2\x80\x99sDoesNotExist异常。
您不需要期望它只返回一个值。
\n\nusername从序列化器中删除除 之外的其他字段
class UserSerializer(serializers.Serializer):\n username = serializers.CharField(max_length=150)\nRun Code Online (Sandbox Code Playgroud)\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这里我创建了两个序列化器类,UserListSerializer并UserGetSerializer在视图中使用它们。
| 归档时间: |
|
| 查看次数: |
7751 次 |
| 最近记录: |