UUID (‘…’) no es serializable JSON

Recibo este error cuando bash pasar el atributo UUID al parámetro url.

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

vistas.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) ... 

¿Alguna sugerencia?

Hay un error de error en Django con respecto a este problema; sin embargo, una costumbre llamada ‘codificador complejo’ por los documentos de Python puede ayudarlo.

 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) 

Ahora si hiciéramos algo como esto

 json.dumps(my_object, cls=UUIDEncoder) 

Tu campo uuid debe estar codificado.

Para usar el UUID en una URL como esa, debes pasarlo como una cadena:

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

FYI – parece que la respuesta de WIM es un poco más completa. Su expresión regular debe ser ajustada. Si terminas usando la representación de cadena de la bala, querrás una expresión regular como esta: [A-Za-z0-9\-]+ que permite caracteres alfanuméricos y guiones.