【问题标题】:Empty Serialised Response in Django Rest FrameworkDjango Rest 框架中的空序列化响应
【发布时间】:2020-03-18 22:00:40
【问题描述】:

我有一个模型、一个视图和一个序列化程序,它们产生以下代表医学测试的响应:

{
    "name": "electrocardiogram",
    "cost": "180.00",
    "results": [
        {
            "id": "bff25813-5846-4eac-812f-7e57d8fbb496",
            "lots more things" : "were here, but I hid them for brevity's sake"
            "video": []
        }
    ]
}

如您所见,它是一个嵌套对象,由一些嵌套的 DRF 序列化器组合在一起。

这很好,但是我想将几个自定义数据库调用放入我的视图逻辑中,因为我想跟踪用户运行了哪些测试。为此,我已经写了。

class RunTestView(generics.RetrieveAPIView):
    serializer_class = TestSerializer

    def get_object(self):
        if 'test' not in self.request.query_params:
            return Response({'Error': 'test not in request'}, status=status.HTTP_400_BAD_REQUEST)

        test = get_object_or_404(Test, id=self.request.query_params['test'])
        return test

    def get(self, request, *args, **kwargs):
        if 'case_attempt' not in request.query_params:
            return Response({'Error': 'case_attempt not in request'}, status=status.HTTP_400_BAD_REQUEST)

        case_attempt = get_object_or_404(CaseAttempt, id=request.query_params['case_attempt'])

        # get the test object which we will later serialise and return
        test = self.get_object()

        # if we've gotten this far, both case_attempt and test are valid objects
        # let's record this in the TestsRunTracking model if it is not already there
        if not TestsRunTracking.objects.all().filter(case_attempt=case_attempt, test=test, user=request.user).exists():
            tracking = TestsRunTracking(case_attempt=case_attempt, test=test, user=request.user)
            tracking.save()

        # serialize and return the Test response
        serializer = self.get_serializer(data=test)

        try:
            serializer.is_valid(raise_exception=False)
        except Http404:
            raise Http404

        return Response(serializer.data, status=status.HTTP_200_OK)

上面的代码会返回:

{
    "non_field_errors": [
        "Invalid data. Expected a dictionary, but got Test."
    ]
}
```. Very dull indeed.
I can of course call the serializer with something like:
```python
serializer = self.get_serializer(data=test.__dict__)

但这不会返回相关对象,只返回父对象:

{
    "name": "electrocardiogram",
    "cost": "180.00",
}

我遵循了 Django Rest Framework 源代码,看起来他们完全按照我在做的事情(显然不是,因为 DRF 确实有效!),但我显然遗漏了一些东西。

因此,总而言之,我试图在我的 get() 响应中返回 Test 对象,并使其返回,如本文顶部所示,包括相关字段和所有内容。

非常感谢任何帮助。

干杯,

C

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    假设您的TestSerializerBaseSerializer (rest_framework.serializers.BaseSerializer) 的实例并且您没有覆盖初始化程序,则序列化程序初始化程序的data 参数旨在用于反序列化即当您处理传入数据(并在需要时创建对象)时,例如在 POST/PUT/PATCH 的情况下。但是您正在对retrieve 中的实例进行序列化(在对象 URL 上获取)。

    您可以将实例 test 作为位置参数传递:

    serializer = self.get_serializer(test)
    

    或者作为命名参数是名称instance的值:

    serializer = self.get_serializer(instance=test)
    

    【讨论】:

    • 非常感谢 heemayl!
    • @anowlinorbit 很高兴,我能帮上忙 :)
    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    相关资源
    最近更新 更多