如何在APIView中获得 serializer-fields ?
在文档中,它只说明如何在序列化程序中添加序列化程序字段,但没有说明如何在APIView中获取序列化程序字段。
我在serializer-fields
中添加了很多CloudServerCreateSerializer
:
class CloudServerCreateSerializer(ModelSerializer):
cpu = serializers.IntegerField() # eg:1,2,4,
ram = serializers.IntegerField() # eg: 1,2,4,
os = serializers.DictField() # eg: {"os_big":"Linux", "os_detail":"CentOS7.2"}
disk_os = serializers.DictField() # {"disk_type":"SSD", "disk_size":"50"}
disk_store = serializers.ListField() # [{"disk_type":"SSD", "disk_size":"50"}, {"disk_type":"SSD", "disk_size":"50"}]
class Meta:
model = CloudServer
exclude = ['expiration_time']
但我不知道如何在视图中获取这些值:
class CloudServerCreateAPIView(CreateAPIView):
serializer_class = CloudServerCreateSerializer
permission_classes = []
queryset = CloudServer.objects.all()
def post(self, request, *args, **kwargs):
print(*args, **kwargs)
#serializer.save()
return Response(data="创建成功", status=HTTP_200_OK, exception=None)
如何在休息框架视图中获取序列化程序字段?
答案 0 :(得分:0)
您正在编写一个APIView
派生类,它只是一个基于类的基本视图。 API Views旨在处理身份验证,内容类型协商等框架任务,将所有请求处理逻辑留给您。他们不了解serializer_class
或queryset
,这些是ModelViewSet的一部分。
值得庆幸的是,手动运行序列化程序并获取所需数据非常容易。你甚至可以为它增加400个错误。
def post(self, request, *args, **kwargs):
ser = CloudServerCreateSerializer(
data=request.data,
context={'request': request}
)
ser.is_valid(raise_exception=True)
data = ser.validated_data
# use the data somehow
一些注意事项:
context
param包含序列化程序可以使用的额外数据。例如,request
用于查找用于创建url字段的主机名。你可以忽略这一点。is_valid(True)
会将所有序列化程序错误提交回客户端,例如400或您抛出的任何错误。您之后不必重新验证其中的数据。*ars, **kwargs
将为空。 /users/(?<username>\w+)/details/
如果您想使用此序列化模型到json,那么您将传递instance
参数:
data = MySerializer(instance=MyModel.objects.first()).data
如果你想让ViewSet完全处理模型(获取,创建,列出,删除......),那么你想使用ModelViewSet
class CloudServerViewSet(ModelViewSet):
serializer_class = CloudServerCreateSerializer
permission_classes = []
queryset = CloudServer.objects.all()
router.register(r'clouds', CloudServerViewSet, base_name='clouds')
# this will give you
# POST /prefix/clouds/ # create
# GET /prefix/clouds/ # list
# GET /prefix/clonds/:pk/ # details
# PATCH /prefix/clonds/:pk/ # update