python - Django get_serializer 'NoneType' 对象不可调用
问题描述
我正在测试 Django (DRF) 应用程序的 API。
我正在调用http://127.0.0.1:8000/api/users/1/documents/ (1 - user id) 并收到错误
...
File "/app/backend/apps/users/views/users/views.py" in create
542. serializer = self.get_serializer(data=request.data)
File "/usr/local/lib/python3.7/site-packages/rest_framework/generics.py" in get_serializer
110. return serializer_class(*args, **kwargs)
Exception Type: TypeError at /api/users/1/documents/
Exception Value: 'NoneType' object is not callable
我如何识别问题?
请求相关视图/app/backend/apps/users/views/users/views.py(问题行是 serializer = self.get_serializer(data=request.data)
)
class UserDocumentCreate(generics.CreateAPIView, generics.RetrieveAPIView):
serializer_class = UserDocumentSerializer
permission_classes = (UserIsOwner, IsAuthenticatedDriver)
queryset = Document.objects.all()
def get_serializer_class(self):
if self.request.version == "1.0":
return UserDocumentSerializer
# return UserDocumentSerializer2
def create(self, request, *args, **kwargs):
request.data._mutable = True
request.data["owner"] = kwargs.get("pk")
serializer = self.get_serializer(data=request.data)
if serializer.is_valid(raise_exception=True):
owner = serializer.validated_data.get("owner")
document_type = serializer.validated_data.get("document_type")
message_status = request.data.get("message_status")
documents = owner.document_owner.filter(
document_type=document_type
)
for document in documents:
if document.status == DocumentStatus.DOCUMENT_REJECTED_STATUS:
document.delete()
# Mark user as new
owner.is_new_user = True
owner.save()
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
response = {
"status": status.HTTP_201_CREATED,
"result": serializer.data,
}
# accept corresponding registration message
if message_status:
driver_reg = DriverRegistration.objects.filter(user=kwargs.get("pk")).first()
driver_reg.accept_by_status(message_status)
next_id = driver_reg.get_next()
# add information about next registration message to response
if next_id != -1:
response["next_message"] = REG_MESSAGES[next_id].to_json()
return Response(
response, status=status.HTTP_201_CREATED, headers=headers
)
相关序列化程序(没什么特别的)
class UserDocumentSerializer(serializers.ModelSerializer):
is_new_document = serializers.BooleanField(read_only=True)
class Meta:
model = Document
fields = (
"id",
"owner",
"file",
"document_type",
"uploaded_at",
"is_new_document",
)
解决方案
您必须始终从get_serializer_class
方法返回一个值。
您需要实现一个 else 条件,或者显式地(如您评论的唯一),或者使用serializer_class
, 或回退到 super 方法。
class UserDocumentCreate(generics.CreateAPIView, generics.RetrieveAPIView):
serializer_class = UserDocumentSerializer
permission_classes = (UserIsOwner, IsAuthenticatedDriver)
queryset = Document.objects.all()
def get_serializer_class(self):
if self.request.version == "1.0":
return UserDocumentSerializer
else:
# explicit
return UserDocumentSerializer2
# property
return self.serializer_class
# super
return super(UserDocumentCreate, self).get_serializer_class()
推荐阅读
- python - 使用 PyTorch v1.4 设置的自动编码器不会减少损失
- node.js - pupeteer 的 pdf 渲染问题
- kubernetes - 如何配置本地 kubectl 连接到 kubernetes EKS 集群
- azure - “没有内核!” 错误 Azure ML 计算 JupyterLab
- python - 在浏览器中下载excel || 姜戈
- html - 将照片添加到列
- optimization - 具有多个约束的 scipy 优化
- wordpress - 在 Zapier 中访问高级自定义字段数据
- c - Haskell -> C FFI 性能
- javascript - 在这个 react redux 代码中在哪里进行切换操作?