UUID('...')不是JSON可序列化的

时间:2016-04-13 03:40:39

标签: python django uuid

当我尝试将UUID属性传递给url参数时,我收到此错误。

/users/invitation

views.py

urlpatterns = [
    url(r'^historia-clinica/(?P<uuid>[W\d\-]+)/$', ClinicHistoryDetail.as_view(), name='...'),
]

model.py

class ClinicHistoryDetail(...):
     ...
     my_object = MyModel.objects.create(...)
     ...
     return redirect(reverse('namespace:name', kwargs={'uuid' : my_object.id}))

有什么建议吗?

5 个答案:

答案 0 :(得分:19)

Django上有一个关于这个问题的错误票,但是python docs定制的所谓“复杂编码器”可以帮到你。

import json
from uuid import UUID


class UUIDEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, UUID):
            # if the obj is uuid, we simply return the value of uuid
            return obj.hex
        return json.JSONEncoder.default(self, obj)

现在,如果我们做了类似的事情

json.dumps(my_object, cls=UUIDEncoder)

你的uuid字段应该被编码。

答案 1 :(得分:3)

将 UUID 转换为 str。

uuid_str = str(uuid_item)

答案 2 :(得分:2)

我为此使用了转换功能,它简单干净。

<h2>Tabs</h2>
<p>Click on the buttons inside the tabbed menu:</p>

<div class="tab">
  <button class="tablinks" >London</button>
  <button class="tablinks">Paris</button>
  <button class="tablinks">Tokyo</button>
</div>

<div id="London" class="tabcontent">
  <h3>London</h3>
  <p>London is the capital city of England.</p>
</div>

<div id="Paris" class="tabcontent">
  <h3>Paris</h3>
  <p>Paris is the capital of France.</p> 
</div>

<div id="Tokyo" class="tabcontent">
  <h3>Tokyo</h3>
  <p>Tokyo is the capital of Japan.</p>
</div>

答案 3 :(得分:1)

要在类似的URL中使用UUID,您应该将其作为字符串传递:

 return redirect(reverse('namespace:name', kwargs={'uuid' : str(object.id)}))

仅供参考 - 看起来WIM的答案更为彻底。你的正则表达当然应该收紧。如果你最终使用了slug的字符串表示,那么你需要一个像这样的正则表达式:[A-Za-z0-9\-]+它允许使用字母数字和连字符。

答案 4 :(得分:0)

我在数据库模型中的UUID字段也遇到了同样的问题,我想打印出来进行调试。我发现pprint()模块中的pprint函数可以处理此问题。您还可以给它一个indent参数,以获得与从json.dumps()获得的缩进类型相同的输出

https://docs.python.org/3/library/pprint.html#pprint.pprint

示例:

>>> import uuid
>>> import pprint
>>> import json
>>> x = uuid.UUID('12345678123456781234567812345678')
>>> x
UUID('12345678-1234-5678-1234-567812345678')
>>> print(x)
12345678-1234-5678-1234-567812345678
>>> json.dumps(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
...
...
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: UUID('12345678-1234-5678-1234-567812345678') is not JSON serializable
>>> pprint.pprint(x)
UUID('12345678-1234-5678-1234-567812345678')