django - 结合json视图的输出

时间:2018-02-17 19:44:46

标签: python json django api views

我编写了一个简单的json api,我使用了一个基类,而且我主要为每个模型类编写一个api视图。我想要的是将少数视图的输出组合到一个url端点,尽可能少地附加代码。

代码:

# base class
class JsonView(View):
   def get(self, request):
        return JsonResponse(self.get_json())
   def get_json(self):
        return {}

class DerivedView(JsonView):
   param = None
   def get_json(self):
      # .. use param..
      return {'data': []}

urls.py:

url('/endpoint1', DerivedView.as_view(param=1))
url('/endpoint2', DerivedView2.as_view())

# What I want:
url('/combined', combine_json_views({
   'output1': DerivedView.as_view(param=1),
   'output2': DerivedView2.as_view()
}))

所以/combined会给我以下json响应:

{'output1': {'data': []}, 'output2': output of DerivedView2}

这就是如何实现combine_json_views:

def combine_json_views(views_dict):
   d = {}
   for key, view in views_dict.items():
      d[key] = view()  # The problem is here
   return json.dumps(d)

问题是调用view()给我编码的json,所以再次调用json.dumps会给出无效的json。我可以调用json.loads(view()),但是解码我刚刚编码的json看起来很糟糕。

如何在这里修改代码(可能是更好的基类),同时保持优雅和简短?没有添加太多代码。有没有办法访问用于构建JsonResponse

的数据(dict)

1 个答案:

答案 0 :(得分:1)

您可以创建一个调用class CombinedView(JsonView): def get_json(self): view1 = DerivedView(param=1) view2 = DerivedView2() d = view1.get_json() d.update(view2.get_json()) return d 方法并组合它们的组合视图:

url('/combined', CombinedView.as_view()),

然后:

<?xml version="1.0" encoding="UTF-8"?>
<Listado_OrdenesResponse xmlns='http://tempuri.org/' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' 
xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
	<Listado_OrdenesResult>
		<diffgr:diffgram xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'>
			<NewDataSet xmlns=''>
				<RowNum diffgr:id='RowNum1' msdata:rowOrder='0'>
					<MATNR>10000101</MATNR>    					<AUFNR>731200000047</AUFNR>
					<MENGE>385</MENGE>
					<MEINS>G</MEINS>
				</RowNum>
				<RowNum diffgr:id='RowNum2' msdata:rowOrder='1'>
					<MATNR>45000528</MATNR>
					<AUFNR>731200000047</AUFNR>
					<MENGE>540</MENGE>
					<MEINS>KG</MEINS>
				</RowNum>
			</NewDataSet>
		</diffgr:diffgram>
	</Listado_OrdenesResult>
</Listado_OrdenesResponse>