【问题标题】:DRF request.data issue with POST methodPOST 方法的 DRF request.data 问题
【发布时间】:2020-09-02 09:05:23
【问题描述】:

我正在使用 DRF 测试 api,当我发布数据时,DRF 返回 status_code 500 并且错误 'MacList' 对象没有属性 'data'。但 GET 没问题。

观看次数:

class MacList(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):

queryset = Testable.objects.all()
serializer_class = TestableSerializer
def get(self,request,*args,**kwargs):
    return self.list(self, request, *args, **kwargs)

def post(self,request,*args,**kwargs):
    return self.create(self, request, *args, **kwargs)

网址:

path(r'api/maclist',views.MacList.as_view())

我正在检查 mixins.CreateModelMixin 源代码

class CreateModelMixin:

"""
Create a model instance.
"""
def create(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data) **#### problem here**
    serializer.is_valid(raise_exception=True)
    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

def perform_create(self, serializer):
    serializer.save()

def get_success_headers(self, data):
    try:
        return {'Location': str(data[api_settings.URL_FIELD_NAME])}
    except (TypeError, KeyError):
        return {}

如果我使用 APIView POST 成功。

class MacList(APIView):

def post(self,request):
    serializer = TestableSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data,status=status.HTTP_201_CREATED)
    return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

请帮帮我!

Django-->3.0.8

djangorestframework-->3.11.0

【问题讨论】:

  • 请格式化您的代码,以便其他人可以阅读
  • 在调用list()create()方法时不需要传递self
  • 使用return self.list(request, *args, **kwargs)self.create(request, *args, **kwargs)

标签: django-rest-framework


【解决方案1】:

派生类调用时不需要将派生类实例传递给继承类方法,当我们使用self时python会自动传递这个实例

如果您将代码更改为,它将起作用

.
.
def get(self,request,*args,**kwargs):
    return self.list(request, *args, **kwargs)

def post(self,request,*args,**kwargs):
    return self.create(request, *args, **kwargs)

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2016-08-05
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多