【问题标题】:Django API passing class/field names, not values associated with themDjango API 传递类/字段名称,而不是与它们关联的值
【发布时间】:2015-06-27 12:56:38
【问题描述】:

所以我在 Django 应用程序中创建了一个 API,并且我有一个遵循该模式的类 NodeID:

class NodeID(enum.IntEnum):
    EIGENVECTOR = 0

我在视图函数中返回的简化版本是这样的:

return json.dumps({'eigenvector': NodeID.EIGENVECTOR})

当我在浏览器中查看我的 API 的结果时,它显示 'eigenvector' 的值是 NodeID.EIGENVECTOR 而不是整数 0。

{"eigenvector": NodeID.EIGENVECTOR }

这使得我的前端无法处理它(显然它不知道 NodeID 是什么)。如何使调用接收 NodeID.EIGENVECTOR 的值而不是变量?

【问题讨论】:

  • 您在此处显示的代码应该可以按您希望的方式工作。能否展示未简化的代码,或演示相同问题的可执行示例?

标签: python django django-views


【解决方案1】:

这与 Python 的 enum 实现有关,它使用自定义元类来修改对其类属性的访问:

仅访问值的工作方式如下:

>>> member = NodeID.EIGENVECTOR
>>> member.value
0

所以从您的简化示例中返回它就像:

return {'eigenvector': NodeID.EIGENVECTOR.value}

更新:如果使用 Python 3.4 并将输出定位为 JSON,Python 自己的 json.dumps() 会本机地将值扩展为序列化表示。 (我在this answer 上发现的)

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}}'

【讨论】:

  • 你是对的,谢谢!问题是我有一个包含此元类类型值的嵌套字典。有没有办法将 .value 全面应用于我的视图函数中返回的所有内容?还是我唯一的选择是 a) 确保在构造返回对象时应用 .value 或 b) 在我返回之前遍历返回对象的树?
  • 我更新了答案,因为我认为如果您最终要以 JSON 格式输出,那么json.dumps() 可能已经提供了您需要的东西。其他一切都很难说/wo 有关您的代码的更多信息。如有必要,您可以为此提出一个新问题。
  • 我一直在使用 json.dumps() 并且仍然遇到这些问题。我希望在它的文档中找到一些东西(目前正在阅读)。我重新创建了您的示例,但没有得到您所说的行为。相反,我得到了:'{"a": Foo.bam, "b": {"c": Foo.bar}}'
  • 我应该在原始问题中说明我正在使用 json.dumps() ,但它让我忘记了,因为我将它隐藏在视图函数装饰器中。马上更新。
  • these comments 中的用户陈述了 Python 3.2 的类似情况。您使用的是哪个 Python 版本? (如果不是3.4,你从哪里导入enum?)
猜你喜欢
  • 2014-09-30
  • 2020-07-24
  • 2015-06-09
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
相关资源
最近更新 更多