Django API 传递 class/field 名称,而不是与它们关联的值
Django API passing class/field names, not values associated with them
所以我在 Django 应用程序中创建了一个 API 并且我有一个 class NodeID 遵循以下模式:
class NodeID(enum.IntEnum):
EIGENVECTOR = 0
我 return 在我看来函数的简化版本是这样的:
return json.dumps({'eigenvector': NodeID.EIGENVECTOR})
当我在浏览器中查看 API 的结果时,它显示 'eigenvector' 的值为 NodeID.EIGENVECTOR 而不是整数 0。
{"eigenvector": NodeID.EIGENVECTOR }
这使得我的前端无法处理它(很明显,它不知道 NodeID 是什么)。我怎样才能使调用接收 NodeID.EIGENVECTOR 的值而不是变量?
这与 Python 对 enum
的实现有关,它使用自定义元 class 来修改对其 class 属性的访问:
仅访问值的工作方式如下:
>>> member = NodeID.EIGENVECTOR
>>> member.value
0
所以从您的简化示例中返回它就像:
return {'eigenvector': NodeID.EIGENVECTOR.value}
更新:如果使用 Python 3.4 并将输出定位为 JSON
,Python 自己的 json.dumps()
会自然地将值扩展为序列化表示。 (我在 this answer 上发现的)
示例 w/ json.dumps()
:
>>> class Foo(IntEnum):
... bam = 0
... bar = 1
...
>>> Foo.bam
<Foo.bam: 0>
>>> json.dumps(Foo.bam)
'0'
带有嵌套结构的示例:
>>> something = {'a': Foo.bam, 'b': { 'c': Foo.bar}}
>>> something
{'a': <Foo.bam: 0>, 'b': {'c': <Foo.bar: 1>}}
>>> json.dumps(something)
'{"a": 0, "b": {"c": 1}}'
所以我在 Django 应用程序中创建了一个 API 并且我有一个 class NodeID 遵循以下模式:
class NodeID(enum.IntEnum):
EIGENVECTOR = 0
我 return 在我看来函数的简化版本是这样的:
return json.dumps({'eigenvector': NodeID.EIGENVECTOR})
当我在浏览器中查看 API 的结果时,它显示 'eigenvector' 的值为 NodeID.EIGENVECTOR 而不是整数 0。
{"eigenvector": NodeID.EIGENVECTOR }
这使得我的前端无法处理它(很明显,它不知道 NodeID 是什么)。我怎样才能使调用接收 NodeID.EIGENVECTOR 的值而不是变量?
这与 Python 对 enum
的实现有关,它使用自定义元 class 来修改对其 class 属性的访问:
仅访问值的工作方式如下:
>>> member = NodeID.EIGENVECTOR
>>> member.value
0
所以从您的简化示例中返回它就像:
return {'eigenvector': NodeID.EIGENVECTOR.value}
更新:如果使用 Python 3.4 并将输出定位为 JSON
,Python 自己的 json.dumps()
会自然地将值扩展为序列化表示。 (我在 this answer 上发现的)
示例 w/ json.dumps()
:
>>> class Foo(IntEnum):
... bam = 0
... bar = 1
...
>>> Foo.bam
<Foo.bam: 0>
>>> json.dumps(Foo.bam)
'0'
带有嵌套结构的示例:
>>> something = {'a': Foo.bam, 'b': { 'c': Foo.bar}}
>>> something
{'a': <Foo.bam: 0>, 'b': {'c': <Foo.bar: 1>}}
>>> json.dumps(something)
'{"a": 0, "b": {"c": 1}}'