2016-04-13 57 views
5

當我嘗試將UUID屬性傳遞給url參數時,出現此錯誤。UUID('...')不是JSON可串行化的

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

views.py

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

model.py

class MyModel(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    ... 

任何建議?

+0

如果你能告訴我們你是如何通過它以及ClinicHistoryDe​​tail正在做什麼,那會更好。 – ozgur

回答

0

對於這樣的一個URL中使用的UUID,你應該把它作爲一個字符串:

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

僅供參考 - 它看起來像WIM的答案是更徹底一點。你的正則表達式肯定會被收緊。如果最終使用了slug的字符串表示形式,則需要這樣的正則表達式:[A-Za-z0-9\-]+它允許使用字母數字和連字符。

+0

您可能仍然收到錯誤消息,因爲UUID或十六進制都不是可序列化的對象。你應該在你的kwargs字典中使它們成爲一個字符串 'str(object.id)'或'str(object.id.hex)' 然後只要確保你的正則表達式匹配你選擇的選項。如果是十六進制,則使用'[0-9a-f] {32}'。否則,使用'[A-Za-z0-9 \ - ] +' –

0

在重定向線,改變kwargs來自:

kwargs={'uuid' : object.id} 

對此

kwargs={'uuid' : object.id.hex} 

,然後使用一個更好的正則表達式中URLPATTERN:

r'[0-9a-f]{32}' 
+0

我仍然有錯誤 – DJeanCar

3

有一個Django上關於這個問題的bug票據,然而由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字段中應進行編碼。