2016-04-13 2 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

Было бы лучше, если бы вы могли показать нам, как вы прошли его, а также то, что делает «ClinicHistoryDetail». – ozgur

ответ

0

Для использования UUID в URL, как это, вы должны передать его в виде строки:

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

FYI - это выглядит как Wims ответ является немного более тщательно. Ваше регулярное выражение обязательно должно быть затянуто. Если вы закончите использовать строковое представление slug, вам понадобится регулярное выражение: [A-Za-z0-9\-]+, которое позволяет использовать буквенно-цифровые символы и дефисы.

+0

Возможно, вы все еще получаете свою ошибку, потому что ни UUID, ни шестнадцатеричный объект не является сериализуемым. Вы должны сделать их строкой в ​​словаре kwargs 'str (object.id)' или 'str (object.id.hex)' Затем просто убедитесь, что ваше регулярное выражение соответствует выбранному вами параметру. Если это 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

Существует В bug ticket на Django в отношении этой проблемы, однако пользовательский так называемый «сложный кодировщик» документов python может вам помочь.

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 поле должно быть закодировано.

Смежные вопросы