【发布时间】: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